主题
面向服务的架构
比较 WLI 数据库事件生成器与 Oracle 数据库适配器作者:Nacho Lafuente 和 Miquel Lopez-Miralpeix 2009 年 4 月发布
选择“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 域,并将应用程序添加到服务器中:
<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.>
在 x0 文本框中输入任何有效的 XML,然后单击 subscription 按钮。此示例使用 <foo/> XML 文档。 服务器日志应该显示如下行。 DatabaseEG inputEvent: <foo/> 此结果说明了将 XML 文档发布到消息代理通道时,WLI 流程将运行。 创建数据库事件生成器现在,您将配置实际数据库事件生成器,以便 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 列检索新员工。步骤如下:
然后,此流程将可以部署。 序列表我们需要一个帮助器表来知晓最后处理日期,以便查找此表中存储的 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 数据库。下表汇总了每种产品的特性:
| ||||||||||||||||||||||||||||||||||