BPEL 面向 WLI 用户的 SOA 套件概要

比较 WLI 数据库事件生成器与 Oracle 数据库适配器

作者:Nacho Lafuente 和 Miquel Lopez-Miralpeix

2009 年 4 月发布

本文相关下载:
 Oracle SOA Suite

[ 第 1 页] [ 第 2 页] [第 3 页]

选择“Receive Data”选项卡以选择将临时存储事件信息的位置。由于此流程是新建的,因此没有变量,您必须创建一个新变量。从“Select variables to assign”组合框中选择“Create a new variable”选项。

需要创建的变量应为 XML 类型,并且名为“inputEvent”。WLI 将为此变量分配表示已接收事件的 XML 文档。

要完成 WLI 流程,您将插入 perform 节点以输出“inputEvent”变量的值。

从 Node Palette 中选择 Perform 节点,将其拖到主窗口内的流程定义中,并将其放在 initial 节点之后、Finish 节点之前。

生成的流程应该如下所示:

双击 Perform 节点并单击 View code 链接以显示此节点的流程源代码。

使用以下代码段输出此变量的值。

public void perform() throws Exception {
            System.out.println("DatabaseEG inputEvent: " + inputEvent);
    }

测试 WLI 流程

在接收实际数据库事件之前,可以对新建的 WLI 流程进行单元测试。

在测试之前,应该将 WLI 流程应用程序部署到正在运行的域。

首先,必须手动或使用 Workshop for WebLogic 启动 WLI 域。

执行以下步骤以使用 Workshop for WebLogic 启动 WLI 域,并将应用程序添加到服务器中:

  • 使用 Window > Open Perspective 选择 J2EE Perspective
  • 在 GUI 的底部选择 Servers 选项卡
  • 通过右键单击 Servers 选项卡添加新服务器。选择 Oracle WebLogic Server version 10gR3 并填充域目录。您应该看到类似于下图的视图。
  • 通过单击 Servers 选项卡顶部的 RunDebug 图标启动已配置的 WLI 域。Console 选项卡应该跟踪正在运行的 WLI 域的输出。
<26-mar-2009 19H47' CET> <Info> <WebLogicServer> <BEA-000377> 
<Starting WebLogic Server with Java HotSpot(TM) Client VM
Version 1.5.0_11-b03 from Sun Microsystems Inc.>
  • 现在,右键单击已配置的域并选择“Add and Remove Projects”以显示以下对话框。
  • 单击 AddDatabaseEGEAR 项目添加到域中,然后单击“Finish”。如果域正在运行,则将部署选定的应用程序。如果域未在运行,请继续启动域。
  • 在 Package Explorer 中选择流程文件 DatabaseEG.java 文件并单击右键。选择 Run As > Run on Server。如果这是任何组件首次在服务器上运行,则将显示以下对话框。此对话框将有助于选择将执行所需组件的服务器。选择预先选定的服务器并选中 Set Server as project default... 复选框,避免将来出现此对话框。
  • 将打开一个新的 Web 浏览器,显示 WLI Process Test Browser。选择 Test Form 选项卡以打开将用于测试此流程的用户友好的 HTML 表单。

x0 文本框中输入任何有效的 XML,然后单击 subscription 按钮。此示例使用 &lt;foo/&gt; XML 文档。

服务器日志应该显示如下行。

DatabaseEG inputEvent: <foo/>

此结果说明了将 XML 文档发布到消息代理通道时,WLI 流程将运行。

创建数据库事件生成器

现在,您将配置实际数据库事件生成器,以便 WLI 流程将接收来自数据库的事件。事件生成器使用可从 http://localhost:7001/wliconsole 访问的 WLI 管理控制台配置 — 针对您的具体域调整主机和端口。

打开 WLI 控制台并从左侧菜单中选择 Event Generators。单击 RDBMS > Create New 创建新的数据库事件生成器。

填充 databaseEG 作为生成器名并单击 Submit。单击 Define a New Channel Rule 创建将数据库事件发布到消息代理通道的特定事件生成器。

针对常用事件属性填充以下信息。

将针对此示例选择一个触发器事件类型。将对此数据库事件生成器进行配置,使其在每次向 HR.EMPLOYEES 表中添加新员工时发布新事件。如果您使用不同的模式,则应该选择其他表。

单击 Table Name 链接选择所需的表。浏览模式和对象类型 (TABLE),最后选择所需的 EMPLOYEES 表。还可以在 Table Name 文本框中输入 HR.EMPLOYEES。

要完成数据库事件生成器配置,您应该选择插入新行时应该选择哪些表列。单击 Select table columns to publish... 链接显示以下对话框。

单击 Check All Columns 和 Submit 发布所有可用列。现在,在主窗体中单击 Submit 完成事件生成器配置。

新创建的数据库事件生成器应该已创建,并且下表反映它已经在运行。

.

功能测试

现在,所有内容都已完全配置,可以测试整个用例了。通过在命令提示符下键入以下内容将新员工插入 HR.EMPLOYEES 表中。

C:\WINDOWS>sqlplus HR/HR
SQL*Plus: Release 10.2.0.1.0 - Production on Lun Oct 27 23:06:03 2008
Conectado a:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> insert into EMPLOYEES(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, 
HIRE_DATE, JOB_ID) VALUES (500, 'Nacho', 'Lafuente', 'nacho.lafuente@bea.com', 
SYSDATE, 'AD_VP');
1 fila creada.
SQL> commit;
Confirmacion terminada.
SQL> exit
Desconectado de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

事件生成器轮询器已经使用 30 秒的频率进行配置。此时间过后,应该在服务器日志中显示以下结果。

DatabaseEG inputEvent: <TableRowSet xsi:schemaLocation="http://www.bea.com/
WLI/RDBMS_EG/databaseeg TableRowSet.xsd" 
xmlns="http://www.bea.com/WLI/RDBMS_EG/databaseeg" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wld="http://www.bea.com/2002/10/weblogicdata">
  <TableRow wld:RowId="0" wld:RowState="Inserted">
    <EMPLOYEE_ID>500</EMPLOYEE_ID>
    <FIRST_NAME>Nacho</FIRST_NAME>
    <LAST_NAME>Lafuente</LAST_NAME>
    <EMAIL>nacho.lafuente@bea.com</EMAIL>
    <PHONE_NUMBER xsi:nil="true"/>
    <HIRE_DATE>2008-10-27T23:12:34+01:00</HIRE_DATE>
    <JOB_ID>AD_VP</JOB_ID>
    <SALARY xsi:nil="true"/>
    <COMMISSION_PCT xsi:nil="true"/>
    <MANAGER_ID xsi:nil="true"/>
    <DEPARTMENT_ID xsi:nil="true"/>
</TableRow>
</TableRowSet> 

此结果说明已经检测到配置的数据库事件并将其发布到 WLI。WLI 流程已经接收此事件并打印表示此事件的 XML 文档。

在 BPEL PM 中实现用例

本章将说明如何在 BPEL PM 中实现同一个用例。

用例将根据 HIRE_DATE 列检索新员工。步骤如下:

  1. 创建一个序列表作为帮助器。
  2. 创建一个 BPEL 流程
  3. 创建一个 DBAdapter 伙伴链接
  4. 向 BPEL 流程中添加 Receive 活动

然后,此流程将可以部署。

序列表

我们需要一个帮助器表来知晓最后处理日期,以便查找此表中存储的 HIRE_DATE 晚于此日期的员工。

用于创建此表的 SQL 语句将如下所示:

CREATE TABLE SEQUENCING_HELPER (TABLE_NAME VARCHAR2(32) NOT
NULL,LAST_READ_DATE DATE);

BPEL 流程

第 0 步 — 安装 JDeveloper

这非常简单:访问 OTN,下载 JDeveloper 10g,只需将其解压缩。

第 1 步 — 启动 JDeveloper

双击 jdeveloper.exe

第 2 步 — 创建一个应用程序

单击 File -> New ... 并选择 Application。填充详细信息并选择 No Template 作为 Application Template。

第 3 步 — 创建一个 BPEL 项目

单击 File -> New ...

输入项目的最少详细信息(例如名称和命名空间)和服务类型:在此示例中为 empty

DBAdapter 伙伴链接

第 1 步 — 从服务中拖放数据库适配器并输入服务名。

第 2 步 — 指定数据库连接。如果未在 JDeveloper 连接的选项卡下创建用于查询模式信息的数据库连接,则现在必须创建此连接。

需要注意的是,连接的 JNDI 名称必须与应用服务器中定义的名称匹配(如果名称不匹配,则在执行期间将使用 JDev 连接的详细信息)。

第 3 步 — 指定服务类型:Poll for New or Changed Records in a Table

第 4 步 — 通过使用 Import tables ... 按钮选择导入 Employees 表。

第 5 步 — 删除所有不需要的关系(例如,全部删除)

第 6 步 — 选择必需的属性(例如,全部保留)

第 7 步 — 选择轮询策略:Update a Sequencing Table

第 8 步 — 提供帮助器表详细信息

第 9 步 — 设置事务和性能详细信息(例如,轮询频率)。

第 10 步 — 查看用于轮询行的 select 语句。

Receive 活动

我们需要针对 BPEL 流程创建 receive 活动以接收入站 DBAdapter 伙伴链接生成的消息。

第 1 步 — 从流程活动选项板拖放 Receive 活动。

第 2 步 — 将其链接到伙伴链接(将左箭头拖到伙伴链接)。

第 3 步 — 更改名称并选中 Create Instance 复选框。

第 4 步 — 通过单击 OK 创建新变量(参见之前的屏幕截图)。

现在,可以在 BPEL PM 服务器上部署流程并对其进行测试。仅在数据库中创建一行(就像在 WLI 功能测试中解释的那样),结果您将在 BPEL 控制台中看到一个新实例。

要点和建议

WLI 和 BPEL PM 能够以类似的方式与数据库交互,并且这两种工具都能够创建响应数据库事件的流程实例(虽然使用不同的轮询策略)。

BPEL PM 根据来自数据库的事件创建“入站”交互,而 WLI 需要配置数据库事件生成器来检索这些事件。BPEL PM 通过 BPEL 流程实例执行的任何按需操作创建“出站”交互,而 WLI 针对流程实例没有等效的出站操作概念。

请注意,对于入站操作,WLI 生成两个不同的事务:一个用于收集消息,另一个用于执行关联的流程。虽然 BPEL PM 可以按相同方式运行,但如果需要,它还可以在同一事务中执行这两种操作。BPEL PM 还提供了各种用于生成入站交互的策略。WLI 仅限于两种不同的轮询策略。

此外,Oracle 数据库适配器还支持多个相关表映射到嵌套的 xml。在 WLI 中仅可用平面 xml 映射,并且限制非常严格,尤其当它们不支持出站选择时。内置的 O/R 映射工具 TopLink 也是一个重要的区别。TopLink 的主要优点是数据库平台可移植性和第三方数据库支持。

最后,Oracle 数据库适配器中的 SQL 抽象意味着无需对 SQL 进行编码。这提高了可维护性,并且意味着可以将同一服务在一个方案中部署到 DB2,而在另一个方案中部署到 Oracle 数据库。下表汇总了每种产品的特性:

特性BPEL PMWLI
DBAdapter/RDBMS EG 配置用户指南用户指南
消息结构XSDXSD
事件和流程的事务行为单独或单个(可自定义)始终单独。一个事务在轮询数据库时启动,在将事件成功传送到 WLI 消息代理时提交。另一个事务在 WLI 流程从消息代理订阅中接收事件时启动,最后在成功完成流程时提交。
轮询策略(入站)
  • 物理删除策略轮询数据库表以获得记录,并且在处理后删除。
  • 逻辑删除策略需要更新每个已处理行上的特定字段,并且在运行时更新 WHERE 子句以筛选出已处理的行。
  • 序列表:最后读取的 ID 策略需要使用帮助器表记住序列值。
  • 序列表:最后更新策略需要使用帮助器表记住最后更新的值。
  • 控制表轮询策略使用控制表存储尚未处理的每行的主键。此方法不可侵入,因为不需要使用触发器创建影子表。它还允许轮询子更新
  • 所有这些策略都可以设置并发线程数(参见批处理和拆分批处理)
仅提供两种不同的策略:事件触发器和 SQL 轮询。

事件触发器策略类似于 BPEL 的序列表策略,因为它涉及存储已经在源表上删除/插入/更新的值的影子触发器和表。这些影子组件(表和触发器)由 WLI 自动创建。

SQL 轮询策略提供了与 BPEL 略有不同的轮询方法。此策略意味着指示两个 SQL 语句:第一个将用于检索某些记录(前 SQL),后一个将通过之前的结果得以动态丰富(后 SQL)。此策略的最常见用法是使用复杂查询检索记录,并且它通常包含 delete 语句作为后 SQL。BPEL 还通过将复杂查询委托给 TopLink 执行引擎涵盖此用例 — 使用 Oracle AS 数据库适配器配置向导隐藏和自定义这些复杂查询的配置。
操作(出站)
  • Insert,用于将新记录插入数据库。
  • Update,用于更新数据库中的现有记录。
  • Write,用于插入或更新记录而不关注记录是否存在。
  • Delete,用于从数据库中删除记录。
  • Merge,首先在数据库中读取相应记录,计算任何更改,然后执行最少更新。
  • Select,用于在给定条件下查询记录。可以将数个查询定义为单独操作。
  • PureSQL,允许绕过 TopLink 执行任意 SQL。
  • QueryByExample,与 SELECT 操作不同,不需要在设计时指定选择条件。
WLI 不提供特定的出站操作,它利用 WLI 控件和常规 Beehive 控件(参见控件)。具有一个可提供随取随用数据库操作(例如,包括 select、update、insert 或 delete)的数据库控件。
SQL 抽象基于 Oracle Toplink。大多数情况下无需 SQL 编码任何有效的 JEE 策略。WLI 应用程序通常通过调用 Beehive 数据库控件、JEE JDBC 逻辑或第三方 ORM 引擎(如 TopLink 或 Kodo)执行数据库操作。
批处理和拆分批处理支持
  • NumberOfThreads:并发线程数。
  • MaxTransactionSize:在一个事务中从数据库提取到适配器的最大行数。
  • MaxRaiseSize:作为一个消息从适配器发送到 BPEL 的最大行数。
  • No Of Threads(类似于 BPEL 的 NumberOfThreads)
  • Max Rows Per Poll(类似于 BPEL 的 MaxTransactionSize)— 定义每个轮询周期中每个处理器线程检索的最大记录数
  • Max Rows Per Event(类似于 BPEL 的 MaxRaiseSize)— 定义将成为单个事件的负载一部分的记录数
[第 1 页] [第 2 页] [第 3 页]

关于作者
Nacho LaFuenteNacho Lafuente 是 Oracle SOA Consulting 的咨询技术经理。在过去 10 年间,他专攻中间件系列中的技术解决方案,并且参与为客户提供许多集成解决方案。在 2008 年加入 Oracle 之前,他已是 BEA Systems 的首席 Iberia 企业架构师。
Nacho LaFuenteMiquel López-Miralpeix 是 Oracle Consulting 的高级首席顾问,专门从事 SOA 和集成方面的工作,主要推广、设计和部署生产解决方案。他已在 Oracle 工作 3 年,此前他曾为不同的 Oracle 合作伙伴工作 10 年。