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

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

作者:Nacho Lafuente 和 Miquel Lopez-Miralpeix

面向 WLI 用户的 SOA 套件概要系列的这一部分将介绍与 WebLogic Integration 的数据库事件功能相对应的 Oracle BPEL 流程管理器功能。

2009 年 4 月发布

本文相关下载:
 Oracle SOA Suite

本文内容:

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

简介

信息系统的主要目的之一就是实现数据处理自动化。当前大多数 IT 需求都基于数据存储、转换和交换。迄今为止,数据库仍是以结构化及可访问方式持久保存信息的一种最常用的选择。集成操作通常需要与数据库交互,以便更新某一资产,或者接收事件通知并采取某种操作。

本文重点介绍 WebLogic Integration (WLI) 和 Oracle SOA 套件(主要是 BPEL 流程管理器 (BPEL PM))如何监听数据库中发生的事件。本文还分析这些事件的接收和处理(一旦检测到事件)。

本文包含的信息将帮助有经验的 WLI 用户了解 BPEL PM 中使用的数据库事件概念,并在这些用户学习 SOA 套件时为其提供快速入门。

有关 BPEL PM 的更多信息,请参阅 Oracle BPEL 流程管理器

WLI 数据库事件生成器

WLI 事件生成器简介

WLI 引入了事件生成器 (EG) 的概念。事件生成器触发事件以响应与事件生成器关联的系统中发生的活动。发生特定事件时,事件生成器负责通过消息代理通道发布有关此事件的信息。消息代理通道是支持发布和订阅操作的独立通信管道,与 JMS 主题非常类似。

每个事件生成器都旨在监视和通知检测到的事件,以便 WLI 流程能够处理此事件。

WLI 事件生成器可以使用不同方法监视系统变更:

  • 轮询 — 使用此方法,事件生成器主动监视变更,根据用户定义的频率执行检查。大多数事件生成器(包括数据库事件生成器)都使用此方法。
  • 按需 — 此方法意味着事件生成器设置监听端点,每当发生事件时会发送通知。HTTP 事件生成器使用此方法。

根据部署类型,事件生成器还分为可集群化的和固定的两类。可集群化的事件生成器统一部署到集群的每个实例。固定事件生成器仅部署到集群的单个实例 — 如果出现故障,则必须将事件生成器迁移到另一个实例。

WLI 10.x 当前支持下表所述的事件生成器。

事件传输事件生成器所执行的操作事件检测部署
文件/FTP/SFTP监视本地文件系统或远程服务器中的文件更改轮询固定
电子邮件读取发送到电子邮件帐户的邮件轮询固定
JMS订阅 JMS 主题或排队接收消息轮询可集群化的
计时器定期唤醒以通知自定义事件。使用业务日历自生成固定
数据库 (RDBMS)监视数据库对象的更改轮询可集群化的
HTTP监听特定 URI 上的 HTTP 请求并进行通知按需可集群化的
MQ 系列类似于 JMS,但使用 IBM WebSphere MQ 消息处理系统轮询可集群化的
TIBCO RV类似于 JMS,但使用 TIBCO Rendezvous 消息处理系统轮询可集群化的

数据库事件生成器体系结构

数据库事件生成器在有关 WLI 的文章中被称作 RDBMS 事件生成器。请参阅 RDBMS 事件生成器用户指南,以获得数据库事件生成器、支持的特性和限制的说明。

数据库事件生成器旨在提供与数据库的集成,以便检测特定事件并使用消息代理通道将其在内部发布到 WLI。

有两种不同的策略支持事件检测:事件触发器SQL 前/后查询

事件触发器 策略旨在利用数据库触发器,使事件生成器能够检测到任何插入/更新/删除的 行。

当事件生成器配置为使用事件触发器时,它将创建一个触发器,用于检测用户表的更改并将更改复制到影子表。影子表是在配置数据库事件生成器时由 WLI 创建的一个辅助表,用于临时存储仍在等待轮询的事件。

示例:

某公司每次聘用新员工时都需要启动一个业务流程。将员工信息存储在 Oracle 数据库的一个表中。该业务流程将使用 WLI 实施,并且只需要员工标识即可继续。

应该使用 WLI 数据库事件生成器检测对员工表执行的插入。将选择事件触发器策略,并且 WLI 将创建一个触发器以处理对员工表的插入操作。此触发器将员工标识复制到影子表,并且将添加一些内部信息(如时间戳)。事件生成器最后将轮询影子表,从中检索最新插入的员工标识。此信息将发布到消息代理通道,同时将激活 WLI 业务流程。

SQL 前/后查询 策略旨在使用自定义 SQL 查询检测事件,此查询将选择数据、发布数据然后执行后查询。每当触发器不足以捕获所需全部信息(例如,信息可能是两个表之间联接的结果)时,建议使用此策略。

  • 初始查询必须始终是返回特定行数的 SQL SELECT 语句。
  • 默认的后查询(空查询)将从用户表中删除返回行。
  • 自定义的后查询可以利用动态参数引用初始查询中返回的列。动态列以 @ 作为前缀,类似于已准备语句中的绑定变量。
  • 针对初始查询中返回的每行执行后查询。

示例:

某网上商店每次在系统中下订单时都需要启动一个业务流程。订单信息将分散到 Oracle 数据库的不同表中。一个表存储订单项目;另一个表存储每个项目的物理位置;最后,再一个表存储常规订单信息。该业务流程将使用 WLI 实施,并且需要这三个表中的信息才能继续。业务流程应该只在订单中的标记设置为“ready”状态时才启动。执行 WLI 业务流程之后,此标记应该更改为“done”。无法保证何时设置此标记 — 插入/更新和标记修改之间不存在任何关系。

应该使用 WLI 数据库事件生成器将更改插入订单表。但是,事件触发器策略效率较低,因为不允许它检查任何条件。它可以在每次插入或更新订单时生成事件,以便 WLI 流程可以检查标记状态。我们认为此方法效率较低。

我们认为 SQL 前/后查询策略可以更高效地处理这种情况。可以对前查询进行配置,使其有选择地对来自订单、位置和项目的信息进行联接。后查询可以是一个将订单标记更改为“processing”的更新。

数据库事件生成器轮询最后将执行前查询并检索某些行的信息。检索到的信息将发布到消息代理通道。对于检索到信息的每行,数据库事件生成器都将执行后查询并将标记更改为“processing”状态。将激活 WLI 业务流程,并且在成功完成之后将状态标记更新为“done”。

下图表示数据库事件生成器体系结构的逻辑视图。用户信息为绿色,数据库事件生成器构件为橙色,用户应用程序构件为蓝色。

数据库事件生成器遵循以下过程:

  • 根据计划(在配置事件生成器时定义)激活
  • 根据以下策略激活处理器:事件触发器 策略或前/后查询 策略。
  • 事件触发器 策略
    • 支持配置多个处理器以允许并发执行 — 除非有特殊要求,否则建议仅使用 1 个线程(默认值)。
    • 如果使用多个处理器,则 WLI 无法保证事件排序。
    • 每个处理器将从影子表中查询最大行数
    • 每个处理器将在已配置消息代理通道中发布检索的信息。
  • 前/后查询 策略
    • 仅使用一个处理器
    • 此唯一处理器执行已配置的前查询并返回多行。
    • 如果没有返回行,则处理器将退出此过程。
    • 针对每个返回行,执行后查询 — 应该慎之又慎。
    • 支持特殊的空的后查询。数据库事件生成器将此后查询解释为删除正在处理的行的一个指示。仅当前查询已经从单个表中选择信息时,才支持此特性。
    • 支持任何其他自定义后查询。请记住,可以使用采用 @ 前缀的自定义绑定变量。每个变量都应该引用已经在前查询中使用的有效列名。
    • 处理器将在已配置消息代理通道中发布检索的信息。

数据库事件生成器高级概念

数据库事件生成器配置

高级配置信息在 事件生成器中进行了解释。请仔细阅读有关适用于数据库事件生成器的不同设置的信息。消息代理通道

数据库事件生成器将已检索信息发布到消息代理通道。此信息可以使用 XML 或原始格式表示,具体取决于通道类型。

以下 XML 模式代码段显示不同消息代理通道的定义

<?xml version="1.0"?>
<channels xmlns="http://www.bea.com/wli/broker/channelfile"
    channelPrefix="/DatabaseEventGenerator"
    xmlns:eg="http://www.bea.com/wli/eventGenerator"
    xmlns:dp="http://www.bea.com/wli/control/dynamicProperties"
    xmlns:foo="http://www.bea.com/WLI/RDBMS_EG/databaseeg">

       <!- A channel passing XML, the XML is element TableRowSet in the foo namespace ->
       <channel name ="TypedXml" messageType="xml"
                qualifiedMessageType="foo:TableRowSet"/>

       <!- A simple channel passing XML ->
       <channel name ="SimpleXml" messageType="xml"/>

       <!- A simple channel passing String ->
       <channel name ="SimpleString" messageType="string"/>

       <!- A simple channel passing rawData ->
       <channel name ="SimpleRaw" messageType="rawData"/>

</channels>

使用控制台配置数据库事件生成器时,WLI 将自动创建一个 XML 模式,此模式可反映将发布到消息代理通道的 XML 文档的格式。此模式定义的内容取决于针对数据库事件生成器所选择的表列。

此 XML 模式可位于域根目录中以事件生成器规则命名的目录内。默认情况下,此 XML 模式名为 TableRowSet.xsd。此模式将定义一个名为 TableRowSet 的包装顶端元素。此顶端元素的作用是在单个 XML 文档中表示一组行,以便到消息代理通道的单个发布可以同时表示多个行。每行都包含在 TableRow 元素内。下图显示一个示例 XML 模式。

每个轮询和事件的最大行数

数据库事件生成器提供了配置参数以限制在单个轮询中处理的事件数和行数。

此特性是否能够限制最大返回行数取决于数据库供应商。请注意,某些数据库供应商不支持此特性。

有两个参数可控制此行为:

  • Max Rows Per Poll — 定义每个轮询周期中每个处理器线程检索的最大记录数
    • 此数字必须是大于 1 且小于 10,000 的有效整数。
    • 默认值为 1。
  • Max Rows Per Event — 定义将作为单个事件的一部分负载的记录数
    • 此参数可控制 XML 文档(表示待发布的事件)中包含的记录数。
    • 此参数应该小于或等于每个轮询的最大行数。

让我们使用示例来分析这些参数。激活数据库事件生成器轮询器。要查询的数据库包含一个有 500 个记录的表。下表显示了上述参数如何影响已发布事件的数量和内容。

Max Rows Per PollMax Rows Per Event选中的行数已发布事件的情况
10105(假设仅提供 5 个寄存器)发布了 1 个事件。此事件包含 5 行。将只激活 1 个 WLI 流程。
1015(假设仅提供 5 个寄存器)发布了 5 个事件。其中每个事件都只包含 1 行。激活 5 个 WLI 流程。
11(其他值忽略)1(假设仅提供 1 个寄存器)发布了 1 个事件。此事件包含 1 行。激活 1 个 WLI 流程。

事务处理行为

每个 WLI 流程都是事务流程,并且数据库事件处理也得益于此行为。WLI 利用 Oracle WebLogic Server JTA 支持和执行事务。每个 WLI 流程都定义一个在激活流程时启动的隐式事务。成功完成后,将提交此事务;如果出现任何错误,则将回滚此事务。

WLI 消息代理基于 WebLogic JMS — 它也支持事务处理行为。数据库事件生成器在内部利用 JMS 事务以确保在事务内处理事件。将数据库事件生成器实施为一个 MDB(消息驱动的 EJB),并利用 EJB 容器事务特性。

下图表示使用数据库事件生成器时涉及的事务边界。消息代理将划分此流程中涉及的事务的界限。

事务 1 与事件生成器的内部处理相关。事件生成器激活时该事务启动,该事务包含数据库操作、事件组合和事件发布。如果不存在错误,将提交此事务。如果发现任何错误,则将回滚此事务 — 丢弃数据库中的更改,并且不发布任何事件。

消息代理将事件生成与事件处理相分离。事务 2 在 WLI 引擎启动 WLI 流程(订阅包含数据库事件的消息代理通道)的新实例时启动。如果 WLI 流程成功处理了来自消息代理的事件,则将提交此事务 — 否则,将回滚此事务。

Oracle 数据库适配器

Oracle 应用服务器适配器简介

Oracle 应用服务器 (AS) 适配器是 Oracle 融合中间件的一个组件,非常适用于 SOA 解决方案,并可为 200 多个打包应用程序提供强健、可伸缩的灵活连接平台。Oracle AS 适配器可以由其他 SOA 套件组件(如 BPEL PM)和 JEE 应用程序使用。

对于任何其他 SOA 套件组件,Oracle AS 适配器能够在 WebLogic 和 OC4J 之外的平台(包括 Websphere)上运行。Oracle AS 适配器能够重用现有资产,方法是将这些资产公开为可以与新应用程序集成并提供“完全集成”的服务。Oracle AS 适配器将底层后端应用程序公开为服务,并将它们表达为可以由其他 Oracle 融合中间件产品调用的 WSDL 文件。Oracle AS 适配器支持多种标准 — Web 服务定义语言 (WSDL)、Web 服务调用框架 (WSIF)、Java 连接器体系结构 (JCA) 以及 XML。

适配器提供以下类型的服务以简化应用程序之间的通信:

  • 请求-响应(出站交互):可以使用服务来创建、删除、更新和查询后端数据以及调用后端工作流和事务。例如,JEE 应用程序客户端可以使用用于 SAP 的 Oracle AS 适配器在 SAP 应用程序内创建客户。
  • 事件通知(入站交互):服务监听或轮询后端事件更改。监听事件时,适配器注册为后端应用程序(配置为将事件推送到适配器)的监听器。此操作由在 BPEL 流程中配置的激活代理完成。客户端应用程序通过与任何其他消息相同的方式接收事件。适配器还可以轮询后端应用程序(通常为数据库或文件),以获得客户端应用程序请求的事件。
  • 元数据服务:适配器元数据定义存储有关业务对象和服务的后端连接和模式的信息。适配器包括用于浏览和存储元数据的设计时组件以及用于运行服务的运行时组件。适配器元数据定义作为 XML 模式定义 (XSD) 和 Web 服务定义语言 (WSDL) 文件生成。