BPEL 面向 WLI 用户的 SOA Suite 概要

在 Oracle SOA Suite 中动态设置 Web 服务和 JCA 适配器端点

作者:Simone Geib

面向 WLI 用户 的 SOA Suite 概要系列文章的这一部分介绍如何在 Oracle SOA Suite 中动态设置适配器端点,其过程与 WebLogic Integration 控件中的过程非常类似。

2010 年 3 月发布

本文相关下载:
 Oracle SOA Suite

简介

大部分业务流程都会用到与外部系统的集成。这些系统可以是文件系统、Web 服务、消息队列、数据库或后端应用程序。大部分情况下,这些系统的端点(队列名称、URL、文件目录等)在开发、测试和生产各环节中是不同的。其他情况下,这些端点在应用程序的生命周期中可更改。

在这些情况下,开发人员可以修改业务流程内有问题的端点属性,然后重新编译、重新部署、重新测试等。显然,这一过程费时且容易出错。更好的办法是让可能会更改的端点变成动态的。

理想情况下,管理员在管理控制台中设置端点属性值。然后业务流程在运行时读取和设置这些值。

本文介绍如何在 Oracle WebLogic Integration (WLI) 和 Oracle SOA Suite 中处理动态端点。

WLI 中的动态端点

WLI 中的大部分控件允许指定 动态属性,运行时将动态属性作为一个 XML 变量传递。这些动态属性覆盖了设计时为控件定义的属性。

为了设置动态属性,必须创建一个符合控件的动态属性模式的 XML 变量,并在控件的 setProperties() 方法中使用它。可以使用 getProperties() 方法检索当前的属性设置。

我们以电子邮件控件为例。该控件的 setProperties() 方法接受一个 EmailControlPropertiesDocument 参数。 EmailControlPropertiesDocument 类型是一个 XML Beans 类,它由 DynamicProperties.xsd(位于 WLI 应用程序的 Schemas 项目的系统文件夹中)中定义的相应模式元素生成。

下面是用于设置电子邮件控件动态属性的 XML 变量的示例:

 <EmailControlProperties>
     <smtp-address>myorg.mymailserver.com:25</smtp-address>
     <from-name>Joe User</from-name>
     <from-address>joe.user@myorg.com</from-address>
     <reply-to-address>reply@myorg.com</reply-to-address>
     <reply-to-name>Joe User</reply-to-name>
</EmailControlProperties>

经常通过 XML MetaData Cache 控件检索控件的属性。(参见 Oracle Database Adapter)。

该控件在运行时从 WLI 缓存检索一个 XML 文档,该文档是管理员通过 WLI 管理控制台创建的。可随时更改此 xml 文档的内容,不会影响已部署的应用程序。

SOA Suite 中的动态端点

可以为 Web 服务绑定组件或 JCA 适配器绑定组件配置消息头属性,这些组件是已部署的 SOA 组合应用程序的组成部分。Oracle JCA 适配器将特定于底层后端操作的属性作为头元素公开,并且允许在业务流程内部操作这些元素。

(参见 Using Header Properties for Oracle JCA Adapters

还可以从 Oracle Enterprise Manager Fusion Middleware Control Console (EM) 添加、删除或恢复 Oracle JCA 适配器属性。下面列出的属性是根据添加、删除或更新属性时适配器的行为进行分类的。

InteractionSpec 或 ActivationSpec 属性

这组属性要求适配器端点是循环的。这组属性的值可在 EM 控制台中更改。然而,属性依赖性约束验证要求使用 Oracle JDeveloper 对这些属性的组合进行更改(添加或删除)。

(参见 The InteractionSpec or ActivationSpec Properties

端点属性

无需重启端点,适配器即可获知端点属性的更改。可以添加或删除属于该组的属性。端点属性表示适配器可能希望公开的辅助调优属性。辅助调优属性包括各种时间间隔、阈值和其他值。这些端点属性不通过 interactionspecactivationspec 属性公开。

(参见 Endpoint Properties

配置适配器的端点属性

包括 invokereceivereplyonMessage 选取活动分支在内的许多 BPEL 活动都提供一个 Properties 选项卡。可以通过这个选项卡设置 JCA 适配器的头属性。

为了使用该功能,要将属性值赋值给一个字符串变量。然后可以在属性选项卡中使用该变量,具体情况将在下面的用例示例中说明。

(有关 BPEL 活动中各属性选项卡的说明,请参见 Introduction to BPEL Activities。)

SOA Suite 中的 域值映射在概念上类似于 WLI 中的 XML 元数据缓存。运行时可以使用域值映射来检索信息。域值映射的使用将在本系列的后续文章中介绍。

通过 Enterprise Manager 为 Web 服务绑定组件或 JCA 适配器配置消息头属性,Oracle JCA 适配器和 Web 服务可以 SOA Suite 组合应用程序中的服务或引用绑定组件。绑定组件是将 SOA 平台与外界相连接的网络协议和服务。可以为 Web 服务绑定组件或 JCA 适配器绑定组件配置消息头属性。

(参见 Understanding Binding Components

有关端点属性的更多信息,请参见 Oracle Fusion Middleware Administrator's Guide for Oracle SOA Suite 的 Configuring Service and Reference Binding Components 一章。

下列适配器支持头属性:

有关 Oracle JCA 适配器属性的更多信息,参见 Oracle JCA Adapter Properties

要配置 JCA 适配器或 Web 服务属性,在 Enterprise Manager 中选择该适配器或 Web 服务的 Properties 选项卡。

(参见 Configuring Service and Reference Binding Component Properties)。

下一节将详细介绍这一过程。

通过 Oracle Enterprise Manager 配置适配器的端点属性

可以从 Enterprise Manager Console 执行各种 Oracle SOA Suite 管理(配置、监视和管理)任务。其中一个任务就是配置 JCA 适配器的端点属性。

通常,设计时在 Oracle JDeveloper 中定义适配器的属性。但是,有可能在以后的阶段中需要编辑或添加预定义属性,或者创建或删除属性。

编辑适配器的预定义属性

要编辑某个入站适配器的预定义属性,使用下列方法之一转到 SOA 组合应用程序:

从 SOA Infrastructure 菜单:
  1. 单击 Home
    将显示 SOA Infrastructure 页面。
  2. 单击 Deployed Composites 选项卡。
    将显示已部署的组合应用程序列表。
  3. Composite 部分中,单击一个具体的 SOA 组合应用程序。
    将显示 SOA Composite 主页。
  4. 在右侧面板的 Services and References 部分中,单击 inbound/outbound adapter (service/reference)
    将显示 Service Home 页面。
从导航器的 SOA 文件夹:
  1. 在 soa-infra 下,单击一个具体的 SOA 组合应用程序。
    将显示 SOA Composite 主页。
  2. 在右侧面板的 Services and References 部分中,单击 inbound/outbound adapter (service/reference)。
    将显示 Service Home 页面。

编辑预定义属性

  1. 单击 Properties 查看当前定义的绑定属性的列表。
  2. 选择要编辑的属性。
  3. 编辑 Value 文本框中的值。
  4. 单击 Save

为适配器添加预定义属性

为适配器添加预定义属性:

  1. 按上面所述,转到 SOA 组合应用程序。
  2. 添加预定义属性:
    1. 单击 Properties 选项卡查看当前定义的绑定属性的列表。
    2. 单击 Add 按钮。将在现有的属性列表后添加一个新的空行。
    3. 单击新行的 Name 域中的 Select Values 图标。
      将显示 Properties 对话框。
    4. 从属性列表中选择一个对特定适配器有效的属性,然后单击 OK
    5. 单击 Save

为适配器创建新属性

为入站适配器创建一个新属性:

  1. 按上面所述,转到 SOA 组合应用程序
  2. 创建一个新属性:
    1. 单击 Properties 选项卡查看当前定义的绑定属性的列表。
    2. 单击 Add 按钮。
      将在现有的属性列表后添加一个新的空行。
    3. 分别在新行的 Name 域和 Value 域中指定属性的名称和值。
    4. 单击 Save

删除适配器的属性

删除入站适配器的某个属性:

  1. 按上面所述,转到 SOA 组合应用程序
  2. 删除某个属性:
    1. 单击 Properties 选项卡查看当前定义的绑定属性的列表。
    2. 选择要删除的属性,然后单击 Delete
      将显示一条消息,要求您对删除操作进行确认。
    3. 单击 OK 确认。
    4. 单击 Save

恢复适配器的属性值

您只能恢复曾经修改过的那些属性。另请注意,您只能对已有的属性值执行恢复操作,不能对在预定义属性列表中添加的属性值或您创建的属性值执行恢复操作。

恢复入站适配器的某个属性值:

  1. 按上面所述,转到 SOA 组合应用程序。
  2. 恢复入站适配器的某个属性值:
    1. 单击 Properties 选项卡查看当前定义的绑定属性的列表。
    2. 选择要恢复的属性,然后单击 Revert
      将显示一条消息,要求您对恢复操作进行确认。
    3. 单击 OK 确认。
    4. 单击 Save

更多信息,请参见 Configuring the End Point Properties for an Inbound AdapterConfiguring the End Point Properties for an Outbound Adapter

用例示例:写入文件前更改文件名和目录

本示例将演示如何动态更改文件控件(在 WLI 中)和文件适配器(在 SOA Suite 中)的端点(文件名和目录)。为了简单并紧扣要点,我们将创建一个只向文件写入消息的流程。现实情况会比这种情况复杂得多。

在 WLI 中实现用例

我们不准备详细讲解这个 WLI 用例,因为我们假定读者了解如何在 WLI 中实现动态文件控件。我们将重点介绍该用例在 SOA Suite 中的实现。

文件控件用于向本地目录写入文件。与许多其他控件一样,文件控件也提供了动态设置端点的动态属性:

<?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>

在我们的示例中,WLI 流程是由一个希望将客户的 XML 文档作为输入的客户端请求节点启动的。XML MetaData Cache 控件用于读取文件目录和文件名的值。转换控件用于为文件控件创建属性。最后,通过文件控件的 setProperties() 方法设置属性。然后,使用文件控件的 write 方法将客户消息写入文件。

尽管该流程中的某些步骤可以合并,但为了使本示例简单易懂,还是将这些步骤作为单独的步骤。

图 1 说明了该 JPD。

图 1:JPD

在 SOA Suite 中实现用例

本节仍将介绍上个示例,但是在 SOA Suite 中实现的。

在本用例中,通过一个客户 xml 消息调用一个 Web 服务来启动业务流程。该业务流程使用文件适配器将客户信息写入到一个文件中。

下节将介绍如何部署和测试该流程,然后演示如何在流程中使用适配器头属性或者通过 Enterprise Manager 控制台更改适配器端点属性。


创建 SOA 应用程序和项目

开始:

  1. 在 JDeveloper 中创建一个新 SOA 应用程序
  1. 将其命名为 SOASuiteWLIEssentials
  1. 创建一个名为 DynamicEndpoints 的新 项目
  1. 单击 Finish

创建 BPEL 流程

  1. 在组合中,将一个 BPEL Process 组件拖放到 Components 泳道中。
  1. Create BPEL Process 对话框中,指定以下设置:
    1. Name: WriteCustomer
    2. Template:One Way BPEL Process
    3. Service Name: writecustomer_client
    4. Expose as a SOAP Service:选中
    5. Input:
      1. 单击手电筒图标,打开 Type Chooser 窗口。
      2. 单击 Import Schema File 图标。
  1. 从您的本地磁盘选择客户的 XML 模式。
  2. 选中 Copy to Project
  1. 单击 OK
  2. 单击 OK
  3. 选择模式的根元素
  1. 单击 OK
  1. 单击 OK
  2. 将使用该信息自动创建该服务的 WSDL。注意,这里指定的输入类型将进入该服务的 WSDL。

添加文件适配器

  1. 将一个 File Adapter 拖放到 External References 泳道中。该文件适配器将每个客户写入到一个文本文件。
  1. 将该服务命名为 WriteCustomerData
  1. 单击 Next
  2. 选择 Define from operation and schema

    选项。该特性使您可以使用文件操作和模式来自动定义 WSDL。
  1. 单击 Next
  2. 选择 Write File 操作。
  1. 单击 Next
  2. 指定以下设置,所有其他设置保持默认值:
    1. Directory for Outgoing Files: c:\temp
    2. File Naming Convention: customer_%SEQ%.xml,以便使用增序编号方式写入文件。只要在该域中输入 %,就会在下拉菜单中看到编号文件的其他选项。
  1. 单击 Next
  2. 浏览寻找表示我们要写入内容的模式 (customer.xsd)
  1. 选择根元素
  1. 单击 OK
  1. 单击 Next,然后单击 Finish 完成文件适配器向导并返回组合中。

将 BPEL 流程与文件适配器相连接

接下来,我们将 BPEL 流程与文件适配器相连接并完成接口定义。

连接的各个组件类似于下图:

在组合中对组件进行连接,将自动在 BPEL 流程内创建伙伴链接引用。

设计 BPEL 流程

  1. 双击 BPEL 组件打开 BPEL 编辑器

    注意, WriteCustomerData 伙伴链接已经在 References 泳道中了,因为您已经在组合中连接了它。编辑器将保持该引用在 BPEL 流程和组合间同步。
  2. Invoke 活动从 Component Palette 拖放到 receiveInput 活动下面的一个插入点。
  1. 将连线从 Invoke 活动拖到 WriteCustomerData 伙伴链接。这将告诉 BPEL 流程调用该文件适配器。
  1. Edit Invoke 对话框中,指定以下内容:
    1. Name: WriteCustomerData
    2. Input 变量: 单击绿色加号图标,然后单击 OK 创建一个新的全局变量,接受默认名称和类型。

      为该输入指定的变量将包含调用服务时发送给服务的数据。使用服务期望的正确类型自动创建该变量。
  1. 单击 OK
  1. 单击 OK

现在,您的 BPEL 流程应该类似于下图:

我们已经创建了与 WriteCustomerData 服务交互时将使用的变量,但尚未填充这些变量。我们首先填充输入变量。

在 BPEL 中,使用 Assign 活动将数据分配给变量。在此示例中,您希望将客户信息赋值给 WriteCustomerData 服务。

  1. Assign 活动拖放到您的 Invoke 活动上方。
  1. 双击 Assign 活动对其进行编辑。
  2. 单击 General 选项卡,将名称改为 assignCustomerData
  1. 单击 Copy Operation 选项卡。
  2. 单击绿色加号图标,选择 Copy Operation 打开 Create Copy Operation 对话框。
  1. 指定下列值:在 From 一侧,依次选择 Variables > Process > Variables > inputVariable > payload > ns2:customer
  2. To 一侧,依次选择 Variables > Process > Variables > WriteCustomerData_Write_InputVariable > body > ns2:customer
  1. 单击 OK

现在,您的 Assign 对话框应该类似于下图:

  1. 单击 OK 返回 BPEL 流程。
  2. 单击 BPEL 流程左上角的绿色复选按钮以便验证该流程。

所有警告都应消失。该流程应该类似于下图:

WriteCustomerData 的输入变量现已填充。

  1. 保存 BPEL 流程。

部署 SOA 组合

必须先使用 Oracle JDeveloper 部署组合应用程序,然后才能测试 BPEL 流程。

开始部署前,请确保您的 SOA 服务器正在运行。

请查看 Deploying SOA Composite Applications,了解如何使用 Oracle JDeveloper 和脚本编写工具部署 SOA 组合应用程序,以及如何创建可在开发、测试和生产环境之间来回移动 SOA 组合应用程序的配置计划。

请查看 Deploying SOA Composite Application,了解如何在 Oracle Enterprise Manager Fusion Middleware Control Console (EM) 中部署、重新部署以及取消部署 SOA 组合应用程序。

在 JDeveloper 内部署组合时,日志应与下面的示例类似:

[07:32:39 PM] ----  Deployment started.  ----
[07:32:39 PM] Target platform is  (Weblogic 10.3).
[07:32:39 PM] Running dependency analysis...
[07:32:39 PM] Building...
[07:33:06 PM] Deploying profile...
[07:33:06 PM] Updating revision id for the SOA Project
'DynamicEndpoints.jpr' to '1.0'..
[07:33:06 PM] Wrote Archive Module to D:\1WLI\2SOASuiteMigration\testProjects\JDev\11gPS1\
SOASuiteWLIEssentials\DynamicEndpoints\deploy\sca_DynamicEndpoints_rev1.0.jar
[07:33:06 PM] Deploying sca_DynamicEndpoints_rev1.0.jar to AdminServer [SGEIB01.emea.bea.
com:7001] 
[07:33:06 PM] Processing sar=/D:/1WLI/2SOASuiteMigration/testProjects/JDev/11gPS1/SOASuiteWLIE
ssentials/DynamicEndpoints/deploy/sca_DynamicEndpoints_rev1.0.jar
[07:33:06 PM] Adding sar file - D:\1WLI\2SOASuiteMigration\testProjects\JDev\11gPS1\SOASuite
WLIEssentials\DynamicEndpoints\deploy\sca_DynamicEndpoints_rev1.0.jar
[07:33:06 PM] Preparing to send HTTP request for deployment
[07:33:07 PM] Creating HTTP connection to host:SGEIB01.emea.bea.com, 
port:7001
[07:33:08 PM] Sending internal deployment descriptor
[07:33:08 PM] Sending archive - sca_DynamicEndpoints_rev1.0.jar
[07:33:28 PM] Received HTTP response from the server, response code=200
[07:33:28 PM] Successfully deployed archive sca_DynamicEndpoints_rev1.0.jar to AdminServer
 [SGEIB01.emea.bea.com:7001] 
[07:33:28 PM] Elapsed time for deployment:  48 seconds
[07:33:28 PM] ----  Deployment finished.  ----

测试 BPEL 流程

部署成功后,可以通过 Oracle Enterprise Manager Fusion Middleware Control Console (EM) 启动组合服务。

  1. 要登录到 Enterprise Manager,使用 Internet Explorer 7、Mozilla Firefox 2.0.0.2 或 Firefox 3.0.x 访问以下 URL: http://host_name:port/em,其中 host_name 是安装 Enterprise Manager 的主机的名称,而 port 是管理服务器的端口号。
  2. 输入 weblogic/password,然后单击 Login

    (有关更多信息,请参见 Getting Started with Administering Oracle SOA Suite。)
  1. 转到 SOA - soa_infra,在 EM 信息板中找到 DynamicEndpoints 组合,单击它以访问该组合的主页。
  1. 在该主页上,您可以通过单击 Test 按钮来测试组合服务。
  1. 正在填写负载...
  1. 单击 Test Web Service 按钮。

如果一切都按计划进行,则将在 C:\temp 中创建一个新文件 customer_1.xml。

通过 Invoke 活动的 Properties 选项卡在运行时更改文件适配器端点

本示例将说明如何在运行时更改适配器端点。与 WLI 用例非常类似,通过 XML Meta Data Cache 控件检索信息,并将信息设置为该控件的属性。

如上所述,可以使用域值映射来检索适配器属性的值。为使本文简明易懂,这个 BPEL 流程示例将对这些属性使用硬编码值,有关域值对的使用将单独介绍。

为属性创建变量

  1. 如果不显示 Structure 窗口(默认情况下位于 JDeveloper 的左上端),转到 View - Structure。
  2. 在 Structure 窗口中,依次单击 Variables - Process - Variables,然后单击绿色加号:
  1. Create Variable 窗口中,定义以下设置:
    1. Name: outputFolder
    2. Simple Type: 单击类型选择器图标,选择变量的类型
  1. 选择 string
  1. 单击 OK
  1. 单击 OK
  1. 对第二个字符串变量 fileName 重复这一过程

为这些变量赋值

这就是在实际情况中需要使用 域值映射 的场合。不过,本示例中我们仍将使用硬编码值。

  1. 向 BPEL 流程添加一个 assign 活动,将它置于 assignCustomerDataWriteCustomerData 之间, 名称 为: setProperties
  2. Copy Operation 选项卡中,添加两个复制操作:
    1. 单击绿色加号,然后选择 Copy Operation
  1. 在左侧,选择 Expression
  2. 输入一个新的输出文件目录,例如," C:\files\output"。
  3. 在右侧选择变量 outputFolder
  1. 单击 OK

重复这些步骤,将新的输出文件名设置为该变量文件名。

现在,您的 Assign 活动应该类似于下图:

  1. 单击 OK

为该文件适配器设置属性

  1. 打开 invoke 活动 WriteCustomerData
  2. 进入 Properties 选项卡
    1. 向下滚动到 jca.file.Directory
    2. 单击 Value 域中的浏览按钮
  1. 浏览变量
  1. 选择 outputFolder 变量
  1. 单击 OK
  2. 单击 OK
  1. 滚动到 jca.file.FileName
  2. 选择 fileName 变量
  1. 单击 OK

现在,BPEL 流程应该类似于下图:

重新部署该组合并再次测试 BPEL 流程。现在,在您新选择的目录中应该有一个具有新名称的文件。

在 Enterprise Manager 中更改文件适配器端点

不必在 BPEL 流程中动态设置属性,也可以在 Enterprise Manager 中更改 JCA 适配器和 Web 服务的属性。

  1. 单击 DynamicEndpoints 组合,然后向下滚动到 Services and References
  1. 单击 WriteCustomerData(文件适配器)
  1. 单击 Properties 选项卡,然后更改 PhysicalDirectoryFileNameConvention。确保输出目录存在。
  1. 单击 Apply,然后单击 Yes,再单击 OK

重新部署该组合并再次测试 BPEL 流程。现在,在您新选择的目录中应该有一个具有新名称的文件。

要点和建议

Oracle SOA Suite 提供了两种不同的方法来动态配置 JCA 适配器和 Web 服务端点:第一种是在 BPEL 流程中设置头属性,这与 WLI 中的做法类似;第二种是在 Enterprise Manager 控制台中修改头属性。


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