主题
面向服务的架构
业务流程中的动态数据查询Oracle WebLogic Integration 中的元数据缓存控件和 SOA Suite 中的域值映射作者:Simone Geib 面向 WLI 用户的 SOA Suite 概要的这一部分介绍,如何在通过 SOA Suite 中的域值映射在运行时检索业务流程中的动态数据,还介绍了这种方法与 WLI 中的 XML 元数据缓存控件的相似性。 2010 年 6 月发布
简介许多常见的集成用例都包括在运行时从一个业务流程中查找动态数据。举例来说,这些数据包括:地址数据、适配器的端点(例如,一个 Web 服务的 URL 或一个文件的位置),或从一个域的词汇到另一个域的词汇的映射。 这些数据具有以下共同特征:它们随时都可能发生变化,因此不能直接绑定到业务流程。在理想情况下,管理员可通过控制台实时更新信息而不必更改任何代码并重新编译或重新部署应用程序。这种情况还可改善性能并提供数据在整个集群中的可用性。 在 Oracle WebLogic Integration (WLI) 中,动态数据检索是通过 XML 元数据缓存控件实现的。该控件基于键值对,其中键是一个字符串,值是一个 XML 文档。该值由管理员通过 WLI 管理控制台进行设置,由业务流程在运行时进行检索。 在 Oracle SOA Suite 中可通过域值映射 (DVM) 实现动态数据检索,动态数据检索只是域值映射的一种使用情况,但却是 WLI 用户特别关注的一种情况。 本文介绍这两个概念,并详细说明 SOA Suite 11g 中域值映射的使用。 为使理论与实践相结合,本文使用一个示例来阐述如何在 BPEL 流程使用域值映射。该示例逐步说明在将一条消息写入一个文件之前如何在运行时查好其文件名及位置。 该用例基于在 Oracle SOA Suite 中动态设置 Web 服务和 JCA 适配器端点(面向 WLI 用户的 SOA Suite 概要系列中的另一篇文章)中讲述的一个示例而构建。强烈建议在学习此用例之前先阅读那篇文章。 WLI 中的 XML 元数据缓存控件WLI XML 元数据缓存控件 用于快速访问一组受管理的键值对。键为 string 类型,值包含 XML 数据。 在一个业务流程中可通过 XML 元数据缓存 控件的 get 方法来检索这些键值对,其中键 是输入参数,值(XML 消息)是返回参数。然后,可以从该 XML 消息中提取相应的条目,并使用这些条目设置动态控件属性(或其他动态数据)。 管理员通过 WLI 管理控制台管理(添加、删除、更新)缓存中的条目而不触及流程。 XML 元数据缓存 是一个全局的域级缓存。该缓存中的数据通过基于文件的存储在整个集群范围内永久可用。 有关 WLI XML 元数据缓存 的详细信息,请参见使用 WebLogic Integration 管理控制台 中的 XML 元数据缓存控件和 XML 缓存。 SOA Suite 中的域值映射 (DVM)在 SOA Suite 中使用域值映射 (DVM) 的初衷是将一个给定域中使用的一种词汇映射到另一个域中使用的另一种词汇。例如,一个域可能使用长名称来表示一个城市 (Boston),而另一个域可能使用短名称来表示同一城市 (BO)。这种情况下,您可以使用 DVM 直接映射这些值。两个或多个域之间的直接值映射称为点到点映射。 每个 DVM 一般包含多个应用程序之间某个特定类别的映射。例如,一个 DVM 可能包含城市代码映射,而另一个 DVM 可能包含州代码映射。 除了直接映射外还支持限定词。一个映射在没有额外的信息对其加以限定时可能是无效的。例如,一个 DVM 包含城市代码到城市名的映射,这个 DVM 可能有多个从 KN 到 Kensington 的映射,因为 Kensington 既是加拿大的一个城市也是美国的一个城市。因此,此映射需要一个用于确认的限定词(USA 或 Canada)。 还可指定多个限定词。限定词只用于对映射进行限定,是不可以查询的。 限定词优先级用于在运行时的查找过程中找到最佳匹配。一个限定词的优先级可从最高到最低变化,这取决于该限定词在定义一个更为精确的匹配方面所起的作用。例如,州限定词的优先级可以比国家/地区限定词高,因为州匹配意味着更精确的匹配。 DVM 支持层次查询。如果在查询时指定了一个限定词值但没有找到精确的匹配,则查询机制通过将更高优先级限定词设置为 "" 来尝试进行更广泛的匹配。它会继续查询,直到找到一个匹配项或者所有限定词设置为 "" 后仍没有找到匹配。 DVM 中的一个值也可映射到多个值(支持一到多的映射)。例如,对 Payment Terms 的域值映射可以包含 payment terms 到三个值(如 discount percentage、discount period 和 total payment period)的映射。 除了这种词汇映射外,域值映射还可用于在运行时查询数据,如查询 J2EE Connector Architecture (JCA) 适配器的动态属性。 例如,可以在调用一个适配器服务之前在 BPEL 流程或 Mediator 组件中使用此查询。 有关 DVM 的详细信息,请参见使用域值映射和编辑域值映射。 JDeveloper 和 SOA Composer可在 Oracle JDeveloper 中创建和编辑 DVM。有关详情,请参见创建域值映射、编辑域值映射、创建层次查询域值映射用例和创建多值域值映射用例。 使用 JDeveloper 时,每次对 DVM 中的值进行更改后都需要重新编译和重新部署应用程序。为了避免进行重新编译和部署工作,SOA Composer(从 SOA Suite 11gR1 PS1 开始)支持在运行时对 DVM 进行编辑。 DVM 元数据可以与一个 SOA 组合相关联,也可以为不同的组合所共享。 SOA Composer 是一个 EAR 文件,作为 SOA 安装的一部分进行安装。它提供在运行时管理 DVM 的全面功能。在 JDeveloper 中创建一个 DVM 之后,您可以在 Composer 中查看和编辑该 DVM。下文 SOA Suite 用例示例的第二部分将逐步说明这一过程。 用例示例下文将介绍如何通过在 WLI 中对文件控件使用 XML 元数据缓存控件 和在 SOA Suite 中对文件适配器使用域值映射 在运行时检索业务流程中的动态属性(文件名和输出目录)。 如前所述,也可在 Mediator 组件中完成该工作。但这里选择使用 BPEL 流程,以便说明与 WLI 中业务流程的相似性。 和往常一样,我们假定读者熟悉 WLI 概念,因此这里不详细描述 WLI 用例。重点将放在 SOA Suite 中的实现上,对此我们将逐步地进行说明。 请确保熟悉在 Oracle SOA Suite 中动态设置 Web 服务和 JCA 适配器端点一文,因为此示例是基于该文中实现的示例构建的。 在 WLI 中实现用例如在 Oracle SOA Suite 中动态设置 Web 服务和 JCA 适配器端点一文中所述,可使用文件控件将文件写入到一个本地目录。 WLI 流程是由一个希望将客户的 XML 文档作为输入的客户端请求节点 启动的。使用一个 XML 元数据缓存控件(图 1 中的 get file properties)读取文件目录和文件名的值。使用一个转换控件 为文件控件创建属性。最后,通过文件控件的 setProperties() 方法设置这些属性。然后,使用文件控件的 write 方法将客户消息写入到文件中。 XML 元数据缓存 控件对 XML 消息进行操作。将使用以下模式检索文件控件属性:
<?xml version= '1.0' encoding= 'UTF-8' ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" targetNamespace="http://demo/fileInfo"
xmlns:fi="http://demo/fileInfo">
<xs:element name="fileInfo">
<xs:complexType>
<xs:sequence>
<xs:element ref="fi:fileDirectory"/>
<xs:element ref="fi:fileName"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="fileName" type="xs:string"/>
<xs:element name="fileDirectory" type="xs:string"/>
</xs:schema>
该示例中使用的 xml 文档定义了该文件的文件名和输出目录:
<fi:fileInfoxmlns:dem="http://demo/Address">
<fi:fileDirectory>C:/files/output</fi:fileDirectory>
<fi:fileName>customerTest.xml</fi:fileName>
</fi:fileInfo>
该流程收到一个 customer 文档,其中包括一个 key 元素作为消息的一部分:
<?xml version= '1.0' encoding= 'UTF-8' ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" targetNamespace="http://demo/demoCustomer1"
xmlns:cu="http://demo/demoCustomer1">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element ref="cu:key"/>
<xs:element ref="cu:firstname"/>
<xs:element ref="cu:lastname"/>
<xs:element ref="cu:address"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="key" type="xs:string"/>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:schema>
从消息中提取此元素并将其用作 XML MetaDataCache 控件 的输入。 在 SOA Suite 中实现用例可以在 Oracle JDeveloper 的一个 SOA 组合应用程序中创建域值映射并使用这些域值映射在运行时查询动态数据。 要创建此用例示例所使用的 SOA 应用程序、项目、组合、BPEL 流程和文件适配器,请执行在 Oracle SOA Suite 中动态设置 Web 服务和 JCA 适配器端点一文的“在 SOA Suite 中实现用例”一节(包括“在运行时通过 Invoke 活动的 Properties 选项卡更改文件适配器端点”一节)中的步骤。 在 JDeveloper 中创建新的域值映射 (DVM)DVM 最初是在 JDeveloper 中创建的。然后可以在 SOA Composer 中随时对其进行更改。 该 DVM 中的值将成为给定客户的输出目录和文件名的属性值。为了识别正确的值,我们将在 customer 模式中使用 key 元素。 在该示例中,我们将只创建一组值,但您可以在 DVM 中创建任意数量的具有不同 key 值的行。 在 Applications Navigator 中,右键单击 DynamicEndpoints 项目,然后选择 New。 展开 SOA Tier 节点,然后选择 Transformations 类别。 在 Items 列表中,选择 Domain Value Map(DVM),然后单击 OK。 随即显示 Create Domain Value Map(DVM) File 对话框。
其他条目将在下一步中添加。 单击 OK。 随即显示 Domain Value Map(DVM) Editor: 此时创建了文件 fileProperties.dvm,它出现在 Application Navigator 中。 创建了一个 DVM 之后,您可以在 Domain Value Map Editor 中对其进行编辑并对显示的数据进行调整。 在此我们要做的只是添加一列“FileName”。 单击绿色“+”号添加一个新的域。 输入“FileName”,然后将 Qualifier 设置为“false”。 单击“OK”。 在 Domain Value 域中添加一个新的输出文件名。 保存更改。 至此就完成了初始 DVM 的创建。 将 DVM 中的值赋予属性值打开前面步骤中创建的 WriteCustomer BPEL 流程。该 BPEL 流程包括一个 assign 活动,该活动将文件适配器属性硬性编码为字符串变量 outputFolder 和 fileName。 这里我们不使用现有的两个 copy operation,而是创建新的操作。新操作将使用前面创建的 DVM 查询值并将值赋予属性变量。 打开 assign 活动 assignProperties。 删除该活动中的两个 copy operations。 创建一个新的 copy operation。 从左侧的 Type 下拉列表中选择 Expression,然后单击小图标打开 XPath Expression Builder。 从右下方的 Functions 下拉列表中选择 DVMFunctions。 选择 lookupValue1M 函数,然后单击 Insert Into Expression。 请注意,在 Description 窗口中描述了此函数的用法和语法。
您可以选择多个目标列。输出将是一个 XML 片段,其中包括所有这些值。但由于我们想将一个值赋予一个字符串变量,因此我们将其划分为两个 copy operation。 该 DVM 函数现在如下所示:
dvm:lookupValue1M("fileProperties.dvm", "Key",
bpws:getVariableData('inputVariable','payload','/ns2:customer/ns2:key
'), "FileDirectory")
单击 OK。 在右侧选择属性变量 outputFolder。 单击 OK。 如果您看到有关该 DVM 函数的错误,该错误会在您单击 OK 后消失。 重复上述步骤,将一个值赋予 fileName 变量。 该 DVM 函数如下所示:
dvm:lookupValue1M("fileProperties.dvm", "Key",
bpws:getVariableData('inputVariable','payload','/ns2:customer/ns2:key
'), "FileName")
该 assign 活动现在应如下所示: 单击 OK。 至此,您就完成了创建 DVM 查询的所有工作。 该 BPEL 流程如下所示: 重新部署该组合并再次测试该 BPEL 流程。确保 key 元素的值为 1。 确认输出目录和文件名是您在 DVM 中定义的目录和文件名,而不是原先在文件适配器中定义的那些。 在运行时更改域值映射您可能首先需要将 SOA Composer 设定为目标,因为默认情况下在开发环境中没有将其设定为目标。 要确认您是否可以使用 Composer,请通过 http://host_name:port/em 登录 Enterprise Manager (EM),这里的 host_name 是安装了 Enterprise Manager 的主机的名称,port 是您的管理服务器的端口号。输入 weblogic/口令,单击 Login。 打开 Farm_soaDomain 下面的 Application Deployments。 如果在已部署的组件中看不到 composer (服务器名),请执行下一节中的步骤。如果可以看到该组件,请跳过下一节。 在 WebLogic Server 管理控制台中将 SOA Composer 设定为目标通过 http://host_name:port/console 登录 WLS 控制台,这里的 host_name 是主机名,port 是您的管理服务器的端口号。 首次访问时会部署控制台应用程序,这可能需要几分钟的时间。 单击左侧 Domain Structure 中的 Deployments。 composer 将处于 Installed 状态。您必须将它设定为目标并启动 它。 单击 composer,然后选择 Targets 选项卡。 选中 composer 左侧的复选框,然后单击 Change Targets 按钮。 选中 AdminServer,然后单击 Yes。 单击左侧 Domain Structure 中的 Deployments,返回到 Deployments。 选中 composer 前面的复选框,然后单击 Start - Servicing all requests。 片刻之后,其状态将更改为 Active。 返回 Enterprise Manager,确认现在 Application Deployment 下存在 composer。 在 SOA Composer 中查看先前创建的 DVM通过 http://host_name:port/soa/composer 登录 SOA Composer,这里的 host_name 是主机名,port 是您的管理服务器的端口号。 如果打开 Composer 时出现问题,请确保正确部署了该 Composer 并将其设定为目标(参见上一步)。 从 Open 菜单中选择 Open DVM。 随即显示 Select a DVM to open 对话框。 选中 fileProperties.dvm,然后单击 Open。 所选 DVM 在视图模式下打开。 在 SOA Composer 中编辑 DVM默认情况下,会在视图模式下打开 DVM。为了编辑 DVM,您需要单击 Edit 菜单项将该模式转为 edit session。 随即在编辑会话中打开该 DVM。 现在,您可以:
在 DVM 中新添一行单击 Add Domain Values。 随即显示 Add Domain Values 对话框。 对 key 输入一个不同于 1 的值。 单击 OK。 输入的值添加到该 DVM 中。 对 DVM 中一行进行编辑选中要编辑的行。 单击 Edit Domain Values。 随即显示 Edit Domain Values 对话框。 根据需要编辑各值,然后单击 OK。 保存 DVM每次在 edit session 中打开一个 DVM 时,会为每个 DVM 每个用户创建一个沙盒。如果您保存自己的更改,这些更改会保存在您的沙盒中。要保存更改,您必须单击 Save 菜单项。 如果所作更改成功保存,您会得到一个通知。 您还可通过单击 Revert 菜单项将 DVM 恢复到上一次保存的状态。 出现一个确认对话框。 单击 Yes 撤销您的更改。 在运行时提交更改为了永久保存更改,您必须提交它们。一旦您提交了更改,运行时将接受它们并将它们保存在 MDS 信息库中。在一个会话中,您也可以保存您的更改而不提交它们。这种情况下,DVM 会保持 Saved 状态。您可以稍后重新打开该 DVM 并提交更改。 单击 Commit 菜单选项。 出现一个确认对话框。 单击 Yes 提交更改。 将更改保存后,再次测试该 BPEL 流程以确认使用的是更改后的值。 删除 DVM 中的一行选中要删除的行,单击 Delete Domain Values。 冲突检测SOA Composer 检测并发操作的用户之间可能发生的冲突。当您打开另一用户正在编辑的 DVM 时,会出现一个警告。 然而,如果您仍想对该 DVM 进行编辑,可单击 Yes 并进行修改。 如果其他户对该 DVM 进行更改并提交所作更改,那么当您提交自己的更改时会看到一个警告: 如果您单击 Yes 并提交您的更改,您的更改会覆盖其他用户所作的更改。 要点和建议上述示例说明如何在 BPEL 流程或 Mediator 中使用域值映射在运行时查询动态数据,以及管理员如何轻松更改数据而无需进行整个枯燥的 IT 重新部署过程。 虽然这并非 DVM 的最初用意,但它却为应对迁移动态 WLI 行为的挑战提供了一个引人注目的全面解决方案。 可在 JDeveloper 轻松建立最初的域值映射,然后在生产环境中使用 Composer 对其进行管理。另外,管理员拥有动态更改应用程序行为的简便生产工具而无需 XML 方面的知识。 要点:
|