转自:http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0907_hopkins/0907_hopkins.html
WebSphere Process Server(此后简称为 Process Server)公开的 SOA 编程模型可以帮助实现广泛的应用程序设计模式。一个常见的模式包含对应的源和目标集成端点系统之间的数据同步。
任何实时企业 IT 环境都涉及一组不同的应用程序,这组应用程序被部署到不同的运行时环境,公开不同的接口。集成架构师需要设计出能够解决这些不兼容性并实现数据同步的解决方案。整体设计必须考虑到每一种集成端点系统在非功能性特征方面的差异。非功能性特征方面的典型差异包括:
- 可用性:计划中或非计划中的宕机很可能以不同方式影响端点系统。这将导致数据同步解决方案的参与方在不同的时间点变得不可用。对于目标系统宕机,您通常需要暂停后续的请求转发。另一种可取的做法是同时禁止额外的同步请求进入到集成中间件集线器(hub)。
- 并发处理能力:某些目标集成端点系统无法处理大容量的并发请求。如果这些系统中涌入了过量的请求,那么将导致操作问题,并且在最坏的情况下,可能会导致目标端点系统故障。
这份共 2 部分的系列文章的第一篇给出了一种简单的方法,可以在目标集成端点不可用时实现智能的存储和转发功能,而不会受到源系统的影响。后续文章将给出一种在 Process Server 内截断集成流量的方法,从而确保目标端点服务器不会挤满大量并发请求。
尽管可以使用 Process Server 实现复杂的多路(n-way)数据同步集线器功能,但是考虑到清晰性,我们在一个包含两个端点集成系统的简单场景中分离了核心问题。这个场景包含一个集成流,接收来自源系统的入站消息并将它们传递到目标系统。我们的示例中的源和目标系统均由 WebSphere MQ Queue Managers 提供。
Process Server 内部署的集成解决方案由两个 Service Component Architecture (SCA) 模块组成(图 1)。第一个模块,可以被看作是一个工作负载注入器,负责在入站消息达到源 Queue Manager 时获取它们。第二个 SCA 模块,可以将其看作一个消息转发器,负责将消息传递到目标 Queue Manager。这些 SCA 模块通过 SCA wiring metaphor 直接连接在一起,形成了一个简单的端到端同步解决方案。但是要注意,SCA 的模块化特性允许以一种不同的方式将这些模块连接在一起;例如,合并包含了其他功能的额外组件。分别使用 SCA Export 和 Import 构造函数来获取传入的消息和转发出站消息,这两个函数都具有一个 WebSphere MQ 绑定类型。
如果所有 Queue Managers 都可用,那么只需要传递消息。然而,当一个目标系统出现宕机,事情就有些复杂了。有许多种方法可以处理这种情况。默认行为是在消息抵达源 Queue Manager 时继续获取它们,并尝试将它们传递到目标集成端点系统。这将造成对每一次消息传递尝试抛出一个故障,该故障由 Process Server Failed Event 子系统拦截。这些失败的事件随后可以从 Failed Event Manager 中管理。然而,对于那些具有较高程度的数据同步流量的系统,捕获的失败事件的数量可能会达到一个很高的水平。在这些情况下,最好实现一种更具可管理性的方法。方法就是,当检测到目标端点系统宕机后,要尽可能快地停止使用入站事件。
要使这两个独立 SCA 模块配合工作,关键机制在于对共享变量的访问,这个共享变量在底层 WebSphere Application Server 运行时引擎提供的 Object Cache 工具中定义。
在从源 MQ Manager 获取消息之前,请求注入器组件将检查这个指示器。如果可用性指示器表示端点服务可用,那么消息将被获取以进行处理。如果端点服务被标记为不可用,那么将创建一个 Human Task 来提供服务宕机通知。
在入站消息处理的开始阶段,系统可用性指示器被设置为 “true”,表示端点系统是可用的。一个向不可用目标 Queue Manager 转发消息的失败尝试将导致抛出一个故障。该故障由请求转发器组件内的 Fault Handler 截获。捕获到故障后,共享系统可用性标志被更新,表示系统宕机。
我们利用底层 WebSphere Application Server 运行时引擎提供的 Object Cache 功能提供一个共享变量,该变量可以同时从 WorkloadInjector 和 RequestPropagator SCA 模块读取和更新。您将需要定义一个新的 Object Cache 实例,如图 2 所示,以执行示例代码。本文后面的 端点系统可用执行路径演示 小节将提供更详细的细节。
Workload Injector 被作为 SCA 模块提供,而中心 SCA 组件被实现为一个 BPEL 流程(图 3)。模块公开了两个导出,第一个用于接受最初的触发事件(用于调用 BPEL 流程)。第二个导出用于反复获取传入的同步请求(被作为消息传递给源 Queue Manager)。模块只有一个导入,用于将组件连接到 Request Propagator 模块。
在入站消息处理的开始阶段,系统可用性指示器被设置为 true,表示端点系统可用。BPEL 流程的其余部分负责反复获取来自源 Queue Manager 的消息。在每次迭代的开始,系统可用性指示器判断是获取下一条消息以进行处理,还是通过安排一个 Human Task 来暂停处理。任务的接受和完成允许最终用户在继续获取消息和终止处理之间做出选择。
从源队列管理器接收入站消息是由一个 SCA Export 以及一个 WebSphere MQ 绑定类型处理的。此结构被绑定到源队列管理器,如图 5 所示。
图 5. InboundMessagesExport MQ 绑定配置
在获取期间,MQ 消息负载和对应的 xsd 数据类型(用于在 Process Server 内部封装数据)之间的同步数据转换是由一个定制 Data Handler 管理的。这个定制 Data Handler 的源数据可以在 Project Interchange 文件中找到,本文的 下载 部分提供了该文件。
关联传入消息
WebSphere Process Server 进行了优化,可以为大量并发执行线程提供一个可伸缩的性能执行环境。多个动态(in-flight)流程实例可以在任何情况下共存。
通过将消息负载中的一个或多个指定字段的值匹配到先前指定的值,入站消息可以被转发到相应的动态流程实例。这一功能是通过使用 Correlation Set 和特定的内含属性集指定的。在当前示例中,我们定义了具有一个内含属性 objType 的 Correlation Set,指定了受控制的同步(图 6)。
该组件也被实现为一个 BPEL 流程,并利用一个 SCA 导入和 MQ Series 绑定来实现与目标 MQ Manager 的交互。
图 7. Request Propagator SCA 的结构图
这里关注的主要特性是在尝试将消息转发给目标 Queue Manager 失败时,使用 BPEL Fault Handler 捕获抛出的故障。在这个 Fault Handler 中,我们更新系统可用性指示器来反映目标 Queue Manager 的不可用性。
让我们首先演示源 Queue Manager 和目标 Queue Manager 之间的成功的受控制的消息同步。SCA 导出和导入分别用于与源队列管理器和目标队列管理器交互,它们已经被配置为使用以下定义。
对于 Source Queue Manager:
- Queue Manager name:Source_QM
- Soure Queue name:Inbound_Queue
- Host name:localhost
- TCP/IP Listener port:1416
对于 Target Queue Manager:
- Queue Manager name:Target_QM
- Soure Queue name:Outbound_Queue
- Host name:localhost
- TCP/IP Listener port:1417
您必须在您的环境中创建这些 Queue Managers,或者分别修改 InboundMessages 和 OutboundMessages SCA Export/Import 配置,以指向源和目标 Queue Manager。
您必须定义用于提供共享变量的 Object Cache 实例。从 WebSphere Process Server 管理控制台中,导航到 Resources > Cache instances > Object cache instances 并单击 New。定义一个 Object Cache 实例,并使用如图 9 所示的参数。
注意,您需要将附带的 Project Interchange 文件 中提供的两个应用程序部署到您的 WebSphere Process Server 实例。确保源队列管理器和目标队列管理器均被启动。一种管理队列管理器的方便方法就是使用 WebSphere MQ 提供的 MQ Explorer 实用程序。
您现在必须启动 RequestInjector 流程。为了保持简单性,我们使用了 BPC Explorer:
- 从 WebSphere Integration Developer shell 或 Web 浏览器打开 BPC Explorer。
- 通过导航到 Process Instances 启动 RequestInjector 流程实例。
- 选择流程模板并单击 Start Instance。在 Process Input Message 模板中,提供流程实例名,并为 objType 字段提供 Customer 值(图 10)。
图 10. 启动 Request Injector 流程 - 单击 Submit 以调用流程实例。流程实例执行 Retrieve Message Receive 行为,在其中流程将等待消息的到来以进行处理。
- 打开 WebSphere MQ Explorer 并通过单击队列名和选择 Put Test Message,将一条消息写入到 Source_QM 中的 Inbound_Queue(图 11)。
图 11. 放入测试消息 - 使用以下格式提供测试消息负载(图 12):
firstName,lastName,addr1,addr2,city,state,zip,CustomerID,Customer
图 12. 测试消息数据 - 单击 Put Message 将消息放入到队列中。这将使 BPEL Receive 等待行为接收消息以进行处理。成功地将消息传播给 Target_QM 中的 Outbound_Queue,这通过目标队列的 Current Queue Depth 的递增值表示。您可以通过右键单击 Outbound-Queue 并选择 Browse Messages 查看出站消息。注意,出站消息中的字段分隔符由 “,” 符号转换成 “|” 符号(图 13)。这种转换发生在定制 DataHandler 内部,是在从 xsd 数据格式转换为字符串消息负载的出站转换期间发生的。
图 13. 传播给 Target Queue 的消息
此时将迭代 RequestInjector,并且再一次等待下一次的消息传播。
假设 RequestInjector 正在等待下一条传入消息的到来以实现前面讨论的同步,您可以通过智能存储和转发实现继续执行系统的不可用路径。
- 通过右键单击队列管理器名并选择 Stop,从 WebSphere MQ Explorer 关闭 Target_QM。
- 通过遵循前一小节介绍的步骤提交后续的入站消息。在传播同步消息期间,WebSphere Process Server 将抛出一个由于 Target_QM 不可用而引发的异常。与该异常相关的 Stack 跟踪被写入到 WebSphere Process Server SystemOut.log 文件,同时写入的还有表示 RequestPropagator BPEL Process 中定义的 Fault Handler 已被调用的消息。
- 在同步下游期间检测到错误后,WorkloadInjector 流程实例将以 Human Task 的形式生成一个 Notification。现在可以通过从 BPC Explorer 选择 My To-dos 查看这个任务(图 14)。
图 14. 目标端点系统宕机 Human Task - 通过选择并单击 Work on 获得该任务。从图 15 的解释文本以及根源错误消息可以看出,错误与队列管理器 Target_QM 有关。
图 15. 目标端点系统宕机通知消息 - 在完成任务前,需要纠正问题并处理失败的动态同步流。从 WebSphere MQ Explorer 启动 Target_QM。在异步 SCA 调用期间遇到的错误将被作为事件持久化到 Failed Event 子系统中。从管理控制台导航到 Integration Applications > Failed Event Manager,打开 Failed Event Manager。单击 Get all 以获取所有失败的事件(图 16)。
图 16. 失败的 Event Manager - 单击 Event ID 链接查看更多细节(图 17)。
图 17. 失败的事件的细节 - 可以通过单击 View business data 查看数据同步消息的负载,如果需要的话还可以进行修改(图 18)。
图 18. 失败的 Event Payload
由于您已经找到了问题的根源,因此现在可以重新提交 Failed Event,允许数据同步流完成。观察消息是否达到 Target_QM Outbound_Queue,以确定重新提交是否成功。
要继续执行数据同步,您必须完成未交付的 Human Task。确保选择了 Task Output Message 中的输出复选框并单击 Complete。
您现在可以继续为同步提交消息,方法就是使用 WebSphere MQ Explorer 将消息放到 Inbound_Queue。
注意,您可以在任意时刻从 BPC Explorer 的 Process Instances > Administered By Me 面板终止流程实例。
WebSphere Process Server 提供了一个功能丰富的、基于组件的编程模型,它为广泛的业务问题实现模块化解决方案。集成多个不同端点系统通常需要使用这些解决方案。因此,负责解决方案设计的集成架构师必须考虑到端点系统之间的操作差异,比如可用性和并行处理能力。这篇文章描述了如何使用 Process Server 编程模型实现一种智能的存储和转发功能,从而在目标端点系统出现意外故障时仍然能够提供接近实时的响应性。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14789789/viewspace-624285/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14789789/viewspace-624285/