BPEL 面向 WLI 用户的 SOA Suite 概要

业务流程中的动态数据查询

Oracle WebLogic Integration 中的元数据缓存控件和 SOA Suite 中的域值映射

作者:Simone Geib

面向 WLI 用户的 SOA Suite 概要的这一部分介绍,如何在通过 SOA Suite 中的域值映射在运行时检索业务流程中的动态数据,还介绍了这种方法与 WLI 中的 XML 元数据缓存控件的相似性。

2010 年 6 月发布

本文相关下载:
 Oracle SOA Suite

简介

许多常见的集成用例都包括在运行时从一个业务流程中查找动态数据。举例来说,这些数据包括:地址数据、适配器的端点(例如,一个 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 可能有多个从 KNKensington 的映射,因为 Kensington 既是加拿大的一个城市也是美国的一个城市。因此,此映射需要一个用于确认的限定词(USACanada)。

还可指定多个限定词。限定词只用于对映射进行限定,是不可以查询的。

限定词优先级用于在运行时的查找过程中找到最佳匹配。一个限定词的优先级可从最高到最低变化,这取决于该限定词在定义一个更为精确的匹配方面所起的作用。例如,州限定词的优先级可以比国家/地区限定词高,因为州匹配意味着更精确的匹配。

DVM 支持层次查询。如果在查询时指定了一个限定词值但没有找到精确的匹配,则查询机制通过将更高优先级限定词设置为 "" 来尝试进行更广泛的匹配。它会继续查询,直到找到一个匹配项或者所有限定词设置为 "" 后仍没有找到匹配。

DVM 中的一个值也可映射到多个值(支持一到多的映射)。例如,对 Payment Terms 的域值映射可以包含 payment terms 到三个值(如 discount percentagediscount periodtotal 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 用例示例的第二部分将逐步说明这一过程。

详情参见使用 SOA Composer 处理域值映射

用例示例

下文将介绍如何通过在 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 对话框。

  • 在 File Name 域中,输入域值映射文件名: fileProperties.dvm
  • 在 Description 域中,输入对该域值映射的说明
  • 对:
    • 第一个 Domain Name 输入 Key
    • 对第一个 Domain Value 输入 1
    • 对第二个 Domain Name 输入 FileDirectory
    • 对第二个 Domain Value 输入 C:\files\output 或其他输出目录。请确保所选目录存在。

其他条目将在下一步中添加。

单击 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 活动,该活动将文件适配器属性硬性编码为字符串变量 outputFolderfileName

这里我们不使用现有的两个 copy operation,而是创建新的操作。新操作将使用前面创建的 DVM 查询值并将值赋予属性变量。

打开 assign 活动 assignProperties

删除该活动中的两个 copy operations

创建一个新的 copy operation

从左侧的 Type 下拉列表中选择 Expression,然后单击小图标打开 XPath Expression Builder

从右下方的 Functions 下拉列表中选择 DVMFunctions

选择 lookupValue1M 函数,然后单击 Insert Into Expression

请注意,在 Description 窗口中描述了此函数的用法和语法。

  • 第一个参数是 DVM 文件,输入“fileProperties.dvm
  • 第二个参数是源列的名称,请输入“Key
  • 第三个参数是源值的名称,在我们的示例中此为 key 的值。我们从 customer 变量(此为输入变量)中的 key 元素中获取此参数的值。
  • 在 BPEL Variables 窗口中,请展开 inputVariable 变量并选择 key 元素。
  • 单击 Insert Into Expression 按钮
  • 最后一个参数是目标列的名称,在本例中为“FileDirectory”。

您可以选择多个目标列。输出将是一个 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 方面的知识。

要点:

  • SOA Suite 为所有 WLI 用例和技术提供全面的集成式支持
  • SOA Suite 提供一种在应用程序中实现动态查询的机制,类似于 WLI 中所提供的机制
    • 限定词增强了运行时动态值查询能力
    • DVM 集成通过使流程模型更加清晰使代码复杂度得以降低。
    • SOA Composer 通过将工作重点放在要进行哪些 更改上而不是如何 更改 XML 上使运营成本得以降低
  • SOA Suite 和 DVM 通过在 SOA Suite 组合(包括 mediator 和 BPEL PM)中使用 DVM 来支持跨应用程序的动态数据系统性重用。

Simone GeibSimone Geib 是 Oracle Corporation 的 SOA 技术产品经理。她曾任职于 BEA Systems,担任 WebLogic Integration 的产品经理,后随 BEA Systems 收购而加入 Oracle。Simone 在 SOA 战略及在不同行业和地区的实现方面拥有丰富的经验。
[ Oracle Mix / 博客 / LinkedIn]