内容


使用 WebSphere Business Events 进行业务事件处理,第 4 部分

将 Business Events 与 WebSphere Enterprise Service Bus 及 WebSphere Process Server 集成

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 使用 WebSphere Business Events 进行业务事件处理,第 4 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:使用 WebSphere Business Events 进行业务事件处理,第 4 部分

敬请期待该系列的后续内容。

引言

本系列的第 1 部分向您介绍了整个系列中使用的交易系统场景。在第 2 部分中,您构建并测试了该交易系统应用程序。在本文中,您将了解如何将 WebSphere Enterprise Service Bus(以下称为 ESB)V6.1.0.1 和 WebSphere Process Server(以下称为 Process Server)V6.1.0.1 与业务事件处理解决方案进行集成。本文并不提供关于 Business Events、ESB 或 Process Server 的详细背景信息。本文将重点关注产品之间的集成模式。

本文的目标受众是希望将 Business Events 作为中介或业务处理解决方案的一部分加以利用的 ESB、Process Server 和 WebSphere Integration Developer(以下称为 Integration Developer)用户。

WebSphere 企业服务总线

WebSphere ESB V6.1.0.1 是用于对面向服务、面向消息和事件驱动的技术进行集成的 IBM 产品。您可以构建和部署中介集成解决方案来对企业内和企业间的新软件应用程序和现有应用程序进行连接。ESB 支持服务请求者和服务提供者之间的服务虚拟化和松散耦合。为了将来自一个服务接口的消息送到另一个接口,经常有必要对消息执行一些操作,如消息充实和转换以及基于消息内容的路由。

WebSphere Process Server

WebSphere Process Server V6.1 是面向服务的体系结构(Service-Oriented Architecture,SOA)综合集成平台,是业务流程管理(Business Process Management,BPM)解决方案的核心运行时环境。通过 BPM 和 Process Server,您可以开发满足业务需求的应用程序,并快速对其调整来适应市场的变化。涉及业务流程自动化和人工任务的 BPM 解决方案能利用 BPEL、SCA、Web 服务和 JMS 等诸多标准。

集成场景

正如本系列前一部分中所述,此场景基于一个交易系统,其中使用 Business Events 应用程序处理买入和卖出事件。如果同一个客户在一小时内买入并卖出同一股票,则 Business Events 系统将生成一个 SellAfterBuy 操作。如果一个客户一天内针对相同股票进行了三次 SellAfterBuy 操作,则会生成一个 SpeculativeCustomer 操作。我们将使用第 2 部分中创建的同一个 Business Events 应用程序。我们只会对 Business Events 项目进行一处更改,即为事件和操作指定新的连接器信息。

我们将进行增强,与 ESB 集成,并讨论 Process Server 通常可以置于此解决方案的什么位置。图 1 显示了本文中描述的集成场景的高级体系结构:

图 1. WebSphere ESB 和 Business Events 集成体系结构
集成体系结构
集成体系结构

如图 1 中所示,此集成体系结构有五个关键组件:

  • 交易系统客户端负责将请求发送到交易系统中。由于本文的重点是 ESB 和 Business Events 集成,因此这个组件在 Integration Developer 中使用 Web Service Explorer 实现。
  • WebSphere ESB 负责整个系统中的消息中介。此组件是本文的重点。ESB 将从客户端接收消息,并将其转发到 Business Events 系统。我们将在本文稍后详细讨论中介模块的实现。
  • Business Events 负责检测何时出现了业务规则。我们将使用在第 2 部分中构建的应用程序。
  • ESB 交易系统负责执行客户端发送的交易。此组件不在本文讨论范围之内,将不会在实现部分进行讨论。
  • 操作处理系统负责在 Business Events 系统启动操作后执行业务流程。由于本文的重点不是 Process Server 的海量业务处理能力,因此我们将此组件作为 Java™ 组件实现,并介绍如何集成 Process Server。

集成场景遵循以下设计原则:

  • ESB 和 Business Events 之间的所有通信都通过 JMS 进行,以实现最优的性能。JMS 级别的集成实现方式是:使用 ESB 流的 JMS 导入和 JMS 导出来与 Business Events 进行交互,并使用 Message Queue Connector 处理 Business Events 中的事件和操作。
  • 所有发布到 Business Events 流的活动都按照逻辑顺序通过 ESB 中的中介模块,此模块会将特定业务对象转换为 Business Events 所需的通用事件结构。
  • 与此类似,Business Events 生成的任何操作按照逻辑顺序通过中介模块,由中介模块负责将通用操作结构转换为操作处理系统所需的特定业务对象。
  • 对 Business Events 事件和操作使用了通用模式,以说明如何在不受事件结构限制的情况下在 ESB 中实现映射。

这些原则确保交易系统和客户端不了解所进行的业务事件处理,因此不需要进行任何修改。

请注意,Business Events 在与 ESB 的交互中扮演着两个不同的角色。对于从交易系统客户端进入 ESB 流的请求,Business Events 是外部服务,或者更为准确地说,是在不影响流的情况下检测事件模式的观察器。一旦确定了模式,Business Events 将生成操作,此时 Business Events 充当客户端,向处理操作的 ESB 流发送请求。

术语

入站和出站术语的使用是相对于所引用的产品而言。ESB 角度的出站流(即来自客户端的交易请求,经过转换并发送到 Business Events)是 Business Events 的入站流,反之亦然。在本文中,我们将相对于 ESB 使用这些术语。

本文中演示的与 Business Events 的集成使用的是 Message Queue Connector。此连接器充当 ESB 中的消息传递提供者和 Business Events 的内部消息传递提供者之间的桥梁。此方法简化了在已经安装了 ESB 或 Business Events 的情况下所需的设置步骤。正如本系列中的其他文章中所示,Business Events 在连接器框架和核心 Business Events 引擎之间内部使用 JMS 主题。因此,ESB 可以直接将消息放到 Business Events 内部主题上进行处理。这将提高总体性能,但是会带来部署问题(本文将不对此进行讨论)。

构建解决方案

我们将使用在第 2 部分中创建的 Business Events 应用程序来说明如何使用 ESB 作为发送事件和使用操作的接触点。

您可以将解决方案的项目交换文件导入到 Integration Developer 中(请参见下载),或按照本文中给出的说明从头构建项目。我们在逐步介绍构建应用程序步骤的过程中,将讨论关键设计要点。

注意:

  1. 操作说明和项目交换文件适用于 V6.1.01 的 ESB、Process Server 和 Integration Developer。
  2. 我们提供的操作说明假定您已经启动了 Integration Developer 并创建了名为 WESBtoWBEIntegration 的新中介模块。

创建接口和业务对象

Business Events 要求输入事件和出站操作对象符合通用 XML 格式。ESB 运行时和 Integration Developer 工具需要此格式的 XSD 表示形式,以便能创建转换,而且 JMS 绑定能够成功地理解入站和出站 XML。已经对这些对象进行了建模,并包含在 Director.xsd 文件中供下载。要将这些对象导入到应用程序中,请执行以下步骤:

  1. 在 Business Integration Navigator 中选择 WESBtoWBEIntegration 项目。
  2. 选择 File => Import => General => File System
  3. 指定所下载的 Director.xsd 文件的位置,并选中对应的复选框。
  4. 单击 Finish

如图 2 中所示,您的应用程序中创建了四个新业务对象:Connector、connector-bundle、connector-object 和 field。

图 2. Business Events 业务对象
新业务对象

这些业务对象是来自 Business Event 的任何操作或事件入站和出站信息的抽象表示形式。接下来让我们稍微深入了解一下其结构:

  • connector 是顶级 XML 元素,它提供诸如连接器名称和提交时间戳等信息。connector 元素可以包括一个 connector-bundle 子元素。
  • connector-bundle 对应于一个操作或事件。目前,一个连接器消息只能包含一个事件或操作。但是,一个事件或操作可以包含一个或多个事件或操作对象;这些对象在模型中表示为 connector-objects
  • 一个 connector-object 映射到一个事件或操作对象。它包括对象的名称和字段的数组。
  • fieldsconnector-object 中的一系列键值对。

图 3 显示了此业务对象的层次结构:

图 3. Business Events 业务对象的层次结构
业务对象的层次结构
业务对象的层次结构

现在已经导入了 Business Events 的通用业务对象,下一步就是为应用程序创建特定的业务对象。需要四个业务对象,分别供交易系统或建模从 Business Events 收到的特定操作时使用。对于 SellAfterBuyProcess 业务对象,请完成以下步骤:

  1. 要创建新业务目标,请从 Business Integration Navigator 中选择 WESBtoWBEIntegration 项目。
  2. 选择 File => New => Business Object
  3. Name 指定为 SellAfterBuyProcess,然后单击 Finish
  4. 单击 添加元素图标 图标,以添加元素。
  5. Properties 窗格的 Description 选项卡上,将 Name 指定为 CustomerID 并为 Type 选择 string
  6. 单击 添加元素图标 图标,以添加另一个元素。
  7. Properties 窗格的 Description 选项卡上,将 Name 指定为 Date 并为 Type 选择 dateTime
  8. 选择 File => Save,以保存业务对象。

使用以下提供的信息对接下来两个业务对象重复上述步骤:

  • TradeObject 代表最终用户提交到交易系统的交易。下表显示了 TradeObject 的字段。
名称类型
StockID 字符串
CustomerID 字符串
Price 双精度
Quantity 双精度
Date dateTime
tradeType 字符串,仅限于 BUY 或 SELL
  • BuyAcknowledgementProcess 是 BuyAck Business Events 事件的 ESB 表示形式。它具有以下字段:
名称类型
CustomerID 字符串
StockID 字符串
Date dateTime

最后一个业务对象 SpeculativeCustomerProcess 是 SellAfterBuyProcess 的超集。要创建此业务对象,请执行以下步骤:

  1. 要创建新业务目标,请从 Business Integration Navigator 中选择 WESBtoWBEIntegration 项目。
  2. 单击 File => New => Business Object
  3. Name 指定 SpeculativeCustomerProcess
  4. Inherit from 选择 SellAfterBuyProcess
  5. 单击 Finish
  6. 选择 File => Save,以保存业务对象。

图 4 显示了四个业务对象的结构。

图 4. 应用程序业务对象的层次结构
应用程序业务对象的结构
应用程序业务对象的结构

现在已经为应用程序定义了业务对象,下一步就要创建所需的接口。您将需要创建四个接口,以与交易系统应用程序通信及与 Business Events 集成。

首先,需要创建能够从客户端接收请求的接口。完成以下步骤,以创建 Trading 接口。

  1. 要创建新接口,请从 Business Integration Navigator 中选择 WESBtoWBEIntegration 项目。
  2. 选择 File => New => Interface
  3. Name 指定为 Trading,然后单击 Finish
  4. 单击添加单向操作图标 添加单向操作图标
  5. 将操作名称由 operation1 更改为 sendTradeEvent
  6. 将输入类型从 string 更改为 TradeObject
  7. 选择 File => Save,以保存接口。

重复这些步骤,使用下面提供的信息创建剩下的三个接口:

  • WESB_to_WBE 接口允许将事件发送到 Business Events 进行处理。此接口只有一个单向方法,名为 event_emission,此方法只有一个参数,其类型为 connector
  • WBE_to_WESB 接口允许 ESB 使用 Business Events 生成的操作。此接口只有一个单向方法,名为 processAction,此方法只有一个参数,其类型为 connector
  • CustomerProcess 是面向后端系统的业务接口,使用 ESB 中介对 Business Events 系统生成的操作进行转换之后,将由后端系统进行处理。对于系统中定义的每个操作类型,此接口都具有三个单向方法。下表显示了 CustomerProcess 接口的详细信息。
方法名称参数名称参数类型
showSellAfterBuyAction input1 SellAfterBuyProcess
showSpeculativeCustomerAction input1 SpeculativeCustomerProcess
showBuyAcknoledgementAction input1 BuyAcknowledgementProcess

图 5 显示了应用程序的接口:

图 5. 应用程序的接口
应用程序的接口
应用程序的接口

定义组装关系图

现在已经定义了应用程序的所有业务对象和接口,因此已经准备好在组装关系图中定义各个组件之间的高级交互。

正如我们前面提到的,由于本文的重点是 ESB 与 Business Events 的集成,因此省略了交易系统本身的实现。应用程序为客户端提供接口来输入交易请求,用于进行转换并转发到 Business Events 进行处理。另一个接口用于从 Business Events 接收操作。这些操作然后将转换为特定的业务对象,并发送到存根组件进行处理。此组件仅仅将请求记录到标准输出中。

请完成以下步骤,以创建组装关系图:

  1. 在 Business Integration Navigator 中双击 WESBtoWBEIntegration 项目中的组装关系图。已经创建了中介模块,但其中不包括任何接口或引用。您将稍后添加这些内容。
  2. CustomerProcess 接口拖放到组装关系图中,并在上下文菜单中选择 Component with no Implementation Type,如图 6 中所示。
    图 6. 创建 BackEndSystem
    创建 BackEndSystem
    创建 BackEndSystem

    此组件作为后端系统使用,用于处理 Business Events 派生的操作。重命名组件 BackEndSystem
  3. Trading 接口拖放到组装关系图中,并选择 Export with Web Service Binding,然后在 Transport 上下文菜单中选择 soap/http。此导出将供交易客户端用于访问交易系统。
  4. WESB_to_WBE 接口拖放到组装关系图中,并从上下文菜单中选择 Import with no Binding。此接口用于将事件提交到 Business Events 进行处理。将接口重命名为 WBEEvent
  5. WBE_to_WESB 接口拖放到组装关系图中,并从上下文菜单中选择 Export with no Binding。此接口用于从 Business Events 接收操作,以进行处理。将接口重命名为 WBEAction
  6. 当操作通过 JMS 导出从 Business Events 发送到 ESB 时,并没有上下文信息可用于确定应该对接口调用的方法。为了处理这个问题,我们创建了自定义函数选择器,将方法硬编码到 processAction 中,如清单 1 中所示。如果按照前面的步骤中所述定义了 WBE_to_WESB 接口,在所附的函数选择器将正常工作,无需任何修改。

    选择 WESBtoWBEIntegration => File => Import,以将 WBEFunctionSelect.jar 导入项目。在 Import 窗口中,选择 General => Archive File and click Next。选择 JAR 文件并单击 Finish

    清单 1. 显示了函数选择器代码。

清单 1. 函数选择器代码
public class WBEFunctionSelector implements FunctionSelector {
	/**
	 * The function selector is hardcoded to always select 
	 * a method called 'processAction.' If this is incorrect, the value
                * MUST be modified.
	 */
	public String generateEISFunctionName(Object[] arg0)
			throws SelectorException {
		return "processAction";
	}
}
  1. 现在已经创建了 WBE_to_WESB 导出和 Business Events 函数选择器,接下来您需要定义导出的绑定。
    1. 右键单击新创建的 WBEAction 导出,并选择 Generate Binding => Messaging Binding => JMS Binding
    2. 在 Configure JMS Export Service 对话框中,指定以下信息,如图 7 中所示:
      • JMS messaging domain:选择 Point-to-Point
      • End-point configuration:选择 Configure new messaging provider resources
      • Security configuration:选中 Specify a Java Authentication and Authorization Services (JAAS) alias security credential when server security is enabled
      • Data binding configuration:指定 com.ibm.websphere.sca.jms.data.impl.JMSDataBindingImplXM。(使用 JMSTextMessage 或 JMSByteMessage 的业务对象 XML。)
      • Function selector configuration:指定 com.ibm.wbe.WBEFunctionSelector
      图 7. 创建 WBE_to_WESB 绑定
      创建 WBE_to_WESB 绑定
      创建 WBE_to_WESB 绑定
  2. 要为 WESB_to_WBE 导入定义绑定,请执行以下操作:
    1. 右键单击 WBEEvent 导入,并选择 Generate Binding => Messaging Binding => JMS Binding
    2. 在 Configure JMS Export Service 对话框中,指定以下信息,如图 8 中所示:
      • JMS messaging domain:选择 Point-to-Point
      • End-point configuration:选择 Configure new messaging provider resources
      • Security configuration:选中 Specify a Java Authentication and Authorization Services (JAAS) alias security credential when server security is enabled
      • J2C Authentication data entry:指定 SCA_Auth_Alias
      • Data binding configuration:指定 com.ibm.websphere.sca.jms.data.impl.JMSDataBindingImplXM。(使用 JMSTextMessage 或 JMSByteMessage 的业务对象 XML)。
      • Function selector configuration:指定 com.ibm.wbe.WBEFunctionSelector
      • 选中 Generate "TargetFunctioName" message header property for default JMS Function Selector
      图 8. 创建 WESB_to_WBE 绑定
      创建 WESB_to_WBE 绑定
      创建 WESB_to_WBE 绑定
  3. 按照以下操作,为 BackEndSystem 创建存根实现,以在中介进行转换之后使用 Business Events 操作:
    1. 右键单击 BackEndSystem 并选择 Generate Implementation => Java
    2. 在 Generate Implementation 对话框中单击 OK。将自动生成存根 Java 类。
    3. 使用以下代码替换生成的方法:
清单 2. 生成的方法的替换代码
publicvoid showSellAfterBuyAction(DataObject input1) {
		System.out.println("Sell After Buy action");
		XMLSerialisationHelper helper = new XMLSerialisationHelper();
		try {
			System.out.println(helper.writeString(input1));
		} catch (Exception e) {
		}
	}

	publicvoid showSpeculativeCustomerAction(DataObject input1) {
		System.out.println("Speculative Customer action");
		XMLSerialisationHelper helper = new XMLSerialisationHelper();
		try {
			System.out.println(helper.writeString(input1));
		} catch (Exception e) {
		}
	}

	publicvoid showBuyAcknowledgementAction(DataObject input1) {
		System.out.println("Buy Acknowledgement action");
		XMLSerialisationHelper helper = new XMLSerialisationHelper();
		try {
			System.out.println(helper.writeString(input1));
		} catch (Exception e) {
		}
		}
  1. 最后,在导出、导入和 SCA 组件之间创建以下连接:
    • TradingExport1 => WESBtoWBEIntegration
    • WBEAction => WESBtoWBEIntegration
    • WESBtoWBEIntegration => BackEndSystem
    • WESBtoWBEIntegration => WBEEvent

现在已经完成了组装关系图的配置。已完成的关系图应该与图 9 类似。

图 9. 已完成的组装关系图
已完成的组装关系图
已完成的组装关系图

定义中介模块

在此部分,我们将详细介绍创建中介流的过程,用于将入站业务对象(采用特定格式)转换为 Business Events 通用格式,然后再转换回特定的业务对象格式。

  1. 创建组装关系图时,向中介模块添加了接口和引用,因此需要重新生成实现。右键单击 WESBtoWBEIntegration 并选择 Regenerate Implementation,然后单击 OK
  2. 要在操作级别映射可能的流逻辑,请创建以下连接:
    • sendTradeObject => eventEmission
    • processAction => showSellAfterBuyAction
    • processAction => showSpeculativeCustomerAction
    • processAction => showBuyAcknowledgementAction

    图 10 显示了此配置的情况。

    图 10. 中介模块操作映射
    中介模块映射
    中介模块映射
  3. 现在让我们为 sendTradeObject 操作定义请求流,当客户端向交易系统发送请求进行处理时将调用此操作。可以发送两种可能的事件类型,buy 或 sell。中介流必须筛选入站消息,创建两个路径,分别用于将消息转换为 Sell Business Events 事件结构和 Buy Business Events 事件结构。务必注意,此阶段我们已经删除了交易系统。在实际的场景中将会有调用交易系统的分支逻辑,但是由于我们这里的重点是 ESB 和 Business Events 集成,因此我们省略了这个阶段的工作。选择 sendTradeObject 操作,并完成以下步骤,以创建和配置原语:
    1. 进行以下操作,以向画布添加 MessageFilter 原语:
      1. 将原语重命名为 SellOrBuyFilter
      2. 此原语会将入站消息路由到两个可能的转换之一。因此,我们需要向此原语添加两个新终端,以代表这些路径。选择原语,在 Properties 窗格的 Terminal 部分中右键单击 Output terminal 部分并选择 Add Output Terminal。在 Terminal configuration 对话框中,将终端名称指定为 Buy 并单击 OK
      3. 重复此过程,以添加名为 Sell 的另一个终端。
      4. 现在已经定义了终端,接下来需要指定路由逻辑。在 Properties 窗格的 Details 部分,选择 Add。在 Add/Edit 对话框中,为 Pattern 输入 /body/sendTradeObject/input1/tradeType="BUY",确保在 Terminal name 字段选择了 Buy 终端,并单击 OK
      5. 重复前面的步骤创建另一个模式,Pattern/body/sendTradeObject/input1/tradeType="SELL",终端选择 Sell

      完成后,原语的配置应该与图 11 中所示类似。

      图 11. trade 事件的 Message filter 属性
      Message filter 属性
      Message filter 属性
    2. 现在添加两个 XSL 转换原语,并将其重命名为 ToWBESellToWBEBuy。直到完成了连接,才算完成了样式表配置。
  4. 现在已经向画布添加了所有原语,接下来需要实现下表中所示的连接:
终端名称目标终端名称
Input Node out SellOrBuyFilter In
SellOrBuyFilter buy ToWBEBuy In
SellOrBuyFilter sell ToWBESell In
ToWBEBuy out CallOut In
ToWBESell out CallOut In

您的中介流应该与图 12 所示类似。

图 12. 事件中介流
事件中介流
事件中介流

现在已经定义了流的连接,接下来就可以配置 XSLT 了。清单 3 是入站 XML 的副本。清单 4 是预期的出站 XML。

清单 3. 入站 XML
<input1>
    <StockID>IBM</StockID>
    <CustomerID>1234</CustomerID>
    <Price>123.50</Price>
    <Quantity>1000</Quantity>
    <Date>2008-04-26T21:32:52</Date>
    <tradeType>BUY</tradeType>
</input1>
清单 4. 出站 XML
<connector version="2.2">
    <connector-bundle type="event"  name="Buy">
        <connector-object name="Trade">
            <field name="StockID" type="String">IBM</field>
            <field name="CustomerID" type="String">1234</field>
            <field name="Price" type="Real">123.50</field>
            <field name="Quantity" type="Real">1000</field>
            <field name="Date" type="dateTime">2008-04-26T21:32:52</field>
        </connector-object>
 </connector-bundle>
</connector>

出站 XML 可以分为两个部分:与提交的事件类型相同的标准模板值(以粗体突出显示)以及从入站消息填充的字段元素。

  1. 选择 ToWBEBuy 原语。在 Properties 窗格的 Details 视图中,选择 New。在 New XML Mapping 对话框,选择 Finish,以接受所有缺省值。
  2. XSLT 映射工具在左侧显示源映射,在右侧显示目标映射。展开左侧和右侧的结构,以便能够看到所有元素。
  3. 在目标主体中右键单击 connector 元素的 version 属性,然后在上下文菜单中选择 Create Transformation。这将自动在 version 属性左侧创建一个 Assign 框,如图 13 中所示。
    图 13. 指定 version 值
    指定 version 值
    指定 version 值
  4. Properties 窗格应该自动显示 General 选项卡。为 Value 输入 3.0 ,如图 14 中所示。
    图 14. 设置 version 值
    设置 version 值
    设置 version 值
  5. connector-bundle 元素的 typename 属性重复此过程,将其值分别设置为 eventBuy
  6. 再对 connector-objectname 属性重复一次此过程,将值设置为 Trade。您的转换应该与图 15 所示类似。
    图 15. 事件转换的静态值设置
    静态值设置
    静态值设置
  7. 转换的第二阶段是将相关信息从源复制到值对的目标映射。首先选择源的 StockID 元素,并将其连接到目标的 field 元素。这将自动创建一个 Inline map 转换,如图 16 中所示。
    图 16. 创建到 field 元素的连接
    连接 field 元素
    连接 field 元素
  8. 您会注意到 Inline map 有一个红色的注释标记。之所以出现此标记,是因为目标映射中有数组结构。因为我们的目标中只有单个 connector-object,其数组索引将始终为 1,因为这是第一个 field 元素,其数组索引将为 1。要输入数组索引信息,请选择 Inline map 并在 Properties 窗格中选择 Cardinality 选项卡。为 connector-object 数组索引输入 1,并为 field 数组索引输入 1,如图 17 中所示。
    图 17. 设置 Inline map 的基数
     设置 Inline map 的基数
    设置 Inline map 的基数
  9. 现在已经解析了数组结构,接下来需要实现内联映射的映射。在与内联映射关联的黄色向下箭头 向下箭头 上单击鼠标。这会将转换编辑器移动到内联映射。
  10. 接下来将 StockID 源元素中存储的值移动到 field 元素的值中。在 StockIDfieldvalue 之间创建连接,如图 18 中所示。
    图 18. 将 StockID 存储在 value 中
    将 StockID 存储在 value 中
    将 StockID 存储在 value 中
  11. 接下来,需要为 field 元素的 nametype 属性分配静态值。与前面的过程类似,右键单击 field 元素的 name 属性,并选择 Create Transformation。这将在 name 属性左侧创建一个 Assign 框,如图 19 中所示。
    图 19. 将静态值存储在 name 属性中
    将静态值存储在 name 属性中
    将静态值存储在 name 属性中
  12. Properties 窗格应该自动显示 General 部分。在 Value 中输入 StockID
  13. type 属性重复此过程,使用 String 作为值。现在应该得到一个完成的内联映射,与图 20 中所示类似。
    图 20. 已完成的内联映射
    已完成的内联映射
    已完成的内联映射
  14. 请使用黄色向上箭头 返回顶级转换。
  15. 您现在已经完成了五个内联映射中的一个。使用以下信息采用相同的步骤再创建四个内联映射:
    • 在源 CustomerID 和目标 Field 数组索引 2 创建内联映射,对 name 属性使用 CustomerID,对 type 属性使用 String
    • 在源 Price 和目标 Field 数组索引 3 创建内联映射,对 name 属性使用 Price,对 type 属性使用 Real
    • 在源 Quantity 和目标 Field 数组索引 4 创建内联映射,对 name 属性使用 Quantity,对 type 属性使用 Real
    • 在源 Date 和目标 Field 数组索引 5 创建内联映射,对 name 属性使用 Date,对 type 属性使用 dateTime

    ToWBEBuy 的转换现在已经完成,应该与图 21 所示类似。

    图 21. 已完成的 ToWBEBuy 转换
    已完成的 ToWBEBuy 转换
    已完成的 ToWBEBuy 转换
  16. 对 ToWBESell 转换重复相同的过程。唯一的修改是将 connector-bundlename 属性更改为 Sell,而不是 Buy

进入 Business Events 的事件的中介流已经完成。接下来,我们需要将注意力转向 processAction 操作的中介流。选择 processAction,以显示空白中介流。和处理前一个流一样,我们将向画布添加所需原语,如下所述:

  1. 进行以下操作,以向画布添加 MessageFilter 中介原语:
    1. 此原语会将来自 Business Events 的入站操作路由到三个可能的转换之一。因此,我们需要向此原语添加三个新终端。选择原语,并在 Properties 窗格的 Terminal 部分选择 Output terminal 部分,单击右键并选择 Add Output Terminal
    2. 将打开 terminal configuration 窗口,填写 speculativeCustomer 作为终端名称,并单击 OK
    3. 重复此过程,添加另两个终端,名为 sellAfterBuybuyAck
    4. 现在已经定义了所有终端,接下来可以指定路由逻辑了。在 Properties 窗格的 Details 部分,选择 Add
    5. 在 Add/Edit 对话框中,为 Pattern 字段输入 /body/processAction/input1/connector-bundle/@name='Speculative Customer',确保在 Terminal name 字段选择了 speculativeCustomer 终端,并单击 OK
    6. 重复此过程,以添加另一个模式,Pattern 指定为 /body/processAction/input1/connector-bundle/@name='Sell After Buy',Terminal name 选择 sellAfterBuy
    7. 重复此过程,以添加另一个模式,Pattern 指定为 /body/processAction/input1/connector-bundle/@name='Buy Ack',Terminal name 选择 buyAck

    原语的配置应该与图 22 中所示类似。

    图 22. 操作的消息筛选器配置
    操作的消息筛选器配置
    操作的消息筛选器配置
  2. 添加三个 XSL 转换,分别名为 speculativeCustomerActionbuyActionsellAfterBuyAction

现在已经将所有原语添加到画布上,接下来请创建以下连接:

终端名称目标终端名称
Input Node out ActionFilter in
ActionFilter sellAfterBuy sellAfterBuyAction in
ActionFilter speculativeCustomer speculativeCustomerAction in
ActionFilter buyAck buyAckAction in
sellAfterBuyAction out CallOut in
speculativeCustomerAction out CallOut in
buyAckAction out CallOut in

您的中介流应该与图 23 所示类似。

图 23. 操作中介流连接
操作中介流连接
操作中介流连接

现在已经定义了流的连接,接下来就可以配置 XSLT 了。清单 5 是入站 XML 的副本。清单 6 是预期的出站 XML。

清单 5. 入站 XML
<connector version="3.0">
    <connector-bundle type="action" name="Sell After Buy">
        <connector-object name="Trade Out">
            <field name="CustomerID" type="String">1234</field>
            <field name="StockID" type="String">IBM</field>
            <field name="Date" type="dateTime">2008-04-26T21:32:52</field>
            <field name="Quantity" type="Real">9</field>
            <field name="Price" type="Real">130.00</field>
            <field name="Key" type="String">Key1</field>
        </connector-object>
 </connector-bundle>
</connector>
清单 6. 输出 XML
<input1>
    <CustomerID>1234</CustomerID>
    <Date>2008-04-26T21:32:52</Date>
</input1>

出站 XML 是来自入站 XML 的 field 元素的解码。

  1. 设置 SellAfterBuyAction 原语。
  2. Properties 窗格的 Details 视图中,选择 New
  3. 在 New XML Mapping 对话框中,选择 Finish,以接受所有缺省值。
  4. XSLT 映射工具在左侧显示源映射,在右侧显示目标映射。展开左侧和右侧的结构,以便能够看到所有字段。左侧的 Business Events 结构是用于所有事件和操作实例的通用结构。您需要从此通用结构映射到特定的 Action 业务对象。您需要映射两个转换。首先,选择 field 元素,并将其连接到目标 CustomerID 元素。
  5. 将生成 submap 转换。选择与 submap 关联的蓝色向下箭头,并选择 Custom。XSLT 编辑器应该如图 24 中所示。
    图 24. Action XSLT 映射
    Action XSLT 映射
    Action XSLT 映射
  6. 由于这是自定义转换,因此需要添加自定义 XPath 表达式。在 Properties 窗格的 General 选项卡上,将 $field[@name='CustomerID'] 作为自定义 XPath 表达式添加,如图 25 中所示。
    图 25. field 的自定义 XPath
     field 的自定义 XPath
    field 的自定义 XPath
  7. 重复此过程,以在源 field 元素和目标 Date 之间添加带有自定义 XPath $field[@name='Date'] 的连接。
  8. 您已经完成了 SellAfterBuyAction 原语的 XSLT 配置。对剩下两个 XSLT 原语重复此过程。自定义 XPath 表达式与以上所示格式相同: $field[@name='<ELEMENT_NAME>'].
  9. 您已经完成了应用程序中介流的开发。选择 File => Save,以保存中介流。

可能的 Process Server 集成点

正如前面提到的,使用了 Java 组件 (BackEndSystem) 来模拟系统 (SpeculativeCustomer),此组件将会对 Business Events 标识的业务事件做出反应。此 Java 组件可以方便地替换为导出,此导出绑定到具有连接到业务流程、人工任务或其他服务的导出的模块。

图 26 显示了用于替换此 Java 组件的 SCA 导入。中介组件将进行连接,以调用业务流程,如图 27 中所示。

图 26. 业务流程的导入
业务流程导入
业务流程导入
图 27. 业务流程
业务流程
业务流程

如前所述,Business Events 所使用的通用事件格式必须转换为应用程序特定的业务对象。ESB 提供此功能,是 Businebss Events 和 Process Server 间的集成的关键组成部分。通过 ESB 将事件数据转换应用程序特定的数据,Business Events 中标识的业务事件可能派生出在 Process Server 上运行的应用程序中的任意数量的处理工作。

安装和测试场景

ESB 和 Business Events 集成解决方案的基础是使用消息队列连接器来处理 Business Events 事件和操作。连接器流程实际上充当 ESB 实例和 WebSphere Application Sever(Business Events 运行时在其上执行)之间的纽带,将消息从一个队列传递到另一个队列。

此部分介绍如何测试前面创建的中介模块。此过程可以划分为四个部分:

  • 安装 ESB 应用程序
  • 配置 ESB 消息传递提供者
  • 修改和安装 Business Events 应用程序
  • 对场景进行测试

安装 ESB 应用程序

以下步骤假定您已经进行了本文中前一部分中的步骤,创建了此应用程序,或已经导入了已经完成的项目交换文件。

  1. 在 Integration Developer 中,从 Servers 窗格中启动 WebSphere ESB Server v6.1
  2. Servers 窗格中右键单击 WebSphere ESB Server v6.1,并选择 Add and Remove Projects,从而将 WESBtoWBEIntegration 项目添加到服务器。
  3. 在 Add and Remove Projects 窗格中,选择 WESBtoWBEIntegration 并单击 Add,然后单击 Finish
  4. Servers 选项卡上,应该能够看到应用程序已经部署到服务器上,如图 28 中所示。
    图 28. ESB 应用程序已部署到服务器
    ESB 应用程序已部署
    ESB 应用程序已部署

配置 ESB 消息传递提供者

不幸的是,ESB 应用程序安装期间生成的连接工厂不是 Business Events 所需的队列连接工厂。因此,您需要手动创建队列连接工厂,以便进行访问。

  1. 将浏览器指向 ESB 管理控制台,例如: http://localhost:9060/admin
  2. 输入用户名和密码(这两项的缺省值为 admin),并单击 Log in
  3. 选择 Resources => JMS => Queue connection factories,如图 29 中所示。
    图 29. 选择 Queue connection factories
    选择 Queue connection factories
  4. Scope 字段中,单击 server level 并单击 New
  5. 选择 Default messaging provider 并单击 OK.
  6. 指定以下值:
    • NameBusiness Events Connection Factory
    • JNDI namejms/WESBtoBusiness Eventscf
    • Bus nameSCA.APPLICATION.xxxCell.Bus
    • Component-managed authentication aliasSCA_Auth_Alias
    • 如果不使用缺省端口配置,可能需要输入提供者端点,不过这将取决于您的设置。有关详细信息,请参见 WebSphere Application Server Information Center
    • 单击 OK

    图 30 显示了所创建的队列连接工厂。

    图 30. 所创建的队列连接工厂
    所创建的队列连接工厂
    所创建的队列连接工厂
  7. 单击 Save
  8. 重新启动 ESB 服务器,以使更改生效。

修改和安装 Business Events 应用程序

在测试此场景之前,需要对 Business Events 应用程序进行一些修改,以使其能够接收事件并将操作发送到 ESB 将侦听的 JMS 队列上,然后部署此应用程序。

  1. 启动 WebSphere Business Events Director Data
  2. 选择 File > Open Project 并指定下载部分提供的 Trading.xml 应用程序的位置。
  3. Touchpoints 下展开 Trade System,以显示关联的事件和操作,如图 31 中所示。
    图 31. 交易系统事件和操作
    交易系统事件和操作
  4. 右键单击 Buy 事件,并选择 Event Properties
  5. 在 Event Buy Properties 对话框中,选择 Connection 选项卡。
  6. 取消选中 File System Connection(如果已选中),选中 Message Queue Connection,然后单击 Configure
  7. 在 Message Queue Event Connection 对话框中,将 WESBtoWBEIntegration/WBEEvent_SEND_D 指定为 Queue Name。(如果对中介模块或 JMS 导出/导入使用了不同的名称,此名称将不正确,将需要在 ESB 或 Process Server 管理控制台中选择 Resources => JMS => Queues 来找到 JNDI JMS Queue 名称。)
  8. 单击 Provider
  9. 在 Provider 对话框中,指定以下信息,如图 32 中所示:
    1. Context Factory Class 选择 com.ibm.websphere.naming.WsnInitialContextFactory
    2. 为 JMS 提供者指定 URL。如果 ESB 是计算机上的唯一服务器,这将为缺省值 iiop://localhost:2809;根据您的 ESB 和 Process Server 配置的不同,可能会需要对此设置进行自定义。
    3. Factory Name 字段中,输入 jms/WESBtoWBEcf
    4. 如果在 ESB 或 Process Server 系统上启用了安全性,请对 UsernamePassword 进行配置,以允许连接器建立连接。这两个的缺省值都是 Admin
    5. 单击 OK
    图 32. 配置 JMS 提供者
    配置 JMS 提供者
    配置 JMS 提供者
  10. 在 Message Queue Event Connection 对话框中,单击 Apply,然后单击 OK
  11. 在 Event Buy Properties 对话框中单击 OK
  12. 重复相同的过程配置 Sell 事件。
  13. 重复相同的过程配置 Buy Ack、Sell After Buy 和 Speculative Customer 操作,但将 JNDI JMS Queue 名称配置为 WESBtoWBEIntegration/WBEAction_RECEIVE_D
  14. 如果 Business Events 运行时环境和任何关联的数据库服务器尚未启动,请将其启动。
  15. 要将应用程序部署到服务器,请选择 Tools => Repositories
  16. 选择所有资产并单击 Add In
  17. 在 Repository Properties 对话框中,填写 Business Events 服务器的详细连接信息(例如,localhost9080),然后单击 OK
  18. 输入 User namePassword(二者的缺省值都是 admin),然后单击 Login
  19. 关闭 Repository 窗口,并关闭 Director Data。
  20. 将浏览器指向 Business Events 管理控制台,例如:http://localhost:9060/admin。(如果安装了多个 Application Server 实例,端口信息可能会有所不同。)
  21. 选择 Applications => Enterprise Applications
  22. 选中 WBERuntimeEAR,然后单击 Stop,如图 33 所示。
    图 33. 停止 Business Events 应用程序
    停止 Business Events
    停止 Business Events
  23. 再次选中 WBERuntimeEAR 并单击 Start
  24. 打开命令提示符并导航到 <WBE_INSTALL>\director\bin。
  25. 输入此命令,以启动连接器框架:connector.bat

Business Events 应用程序已经成功安装,而且已经启动了连接器。您现在准备测试 ESB 集成。

对场景进行测试

您将使用 Integration Developer Web Service Explorer 来测试解决方案。

  1. 在 Business Integration 透视图中,单击 Physical Resources 选项卡。
  2. 展开 WESBtoWBEIntegration 项目,右键单击 WESBtoWBEIntegration_TradingExport1.wsdl 并选择 Web Services => Test with Web Service Explorer
  3. 在 Web Service Explorer 中单击 sendTradeObject
  4. 指定以下信息:
    • StockIDIBM
    • CustomerID12345
    • Price130.00
    • Quantity100
    • Date2008-06-06T10:58:45.651Z
    • tradeTypeBuy
  5. 单击 Go
  6. 重复此过程,但是选择 Sell(而不是 Buy)作为 tradeType
  7. 单击 Console 选项卡。应该看到 Buy Acknowledgement 和 Sell After Buy 操作,如图 34 中所示。
图 34. 应用程序的示例输出
应用程序的示例输出
应用程序的示例输出

总结

在本文中,我们了解了如何创建演示 ESB 和 Business Events 间的事件和操作集成点的应用程序。我们通过使用中介流组件创建了 XSLT 转换,以将应用程序特定的消息转换为 Business Events 所支持的格式。另外,还创建了包含 XSLT 转换的中介流,用于处理 Business Events 发送的操作。接下来,我们设置了 JMS 资源,以便 ESB 将事件发送到 Business Events,而让 Business Events 将操作发送到 ESB。最后,我们对解决方案进行了测试,首先将事件发送到 ESB,然后发送到 Business Events 上,并看到了 Business Events 生成的事件被 ESB 使用。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=396696
ArticleTitle=使用 WebSphere Business Events 进行业务事件处理,第 4 部分: 将 Business Events 与 WebSphere Enterprise Service Bus 及 WebSphere Process Server 集成
publish-date=06182009