IBM BPM V8.5 是一个综合性业务流程管理平台,它为业务流程的管理提供了全面的可视性和洞察。IBM MQ 是一个健全的消息中间件,简化并加速了跨多个平台的各种应用程序和业务数据的集成。IBM MQ 有助于在应用程序与系统之间执行有保证的、安全的、可靠的信息交换。如果需要从业务流程内向其他系统发送数据和从其他系统接收数据,由于 IBM MQ 在快速和无缝连接上的优秀记录,通常会选择使用它。
创建长时间运行的有状态工作流,利用 来自 Bluemix 的 Workflow 服务 中的同步或异步的事件驱动交互来协调任务和服务。免费试用该服务!
本教程将介绍从业务流程向 IBM MQ 发送数据和从 IBM MQ 接收数据,推动业务流程向前发展的方法。这些示例逐步演示了一个描述不同场景的简单用例。本教程假设您拥有 IBM BPM 和 IBM MQ 的基本知识。要理解和运行教程中提供的代码示例,需要使用以下软件:
回页首
本教程使用了一个简单的信用卡申请业务流程示例,用它来演示将 IBM BPM 与 IBM MQ 集成的各种方式。流程中的第一步是收集客户的信息,比如社会安全号码 (SSN) 和客户姓名。然后,通过 IBM MQ 将客户 SSN 发送给一家信用评分服务提供商,该提供商通过 IBM MQ 将信用评分发回给业务流程。如果信用评分低于 650,则需要获得经理批准。图 1 显示了 Process Designer 中的业务流程定义 (BPD) 示例。
图 1. IBM BPM 中的 Credit Card Application Process 示例流程
点击查看大图
关闭 [x]
为了简化该流程,使用了一个脚本活动来初始化客户信息。 Credit Check 系统将一条包含客户信息的消息发送给 IBM MQ。然后在流程中放入一个消息事件来等待通过 IBM MQ 发回的信用检查结果。该消息事件附加到一个幕后的代理来等待消息。
回页首
在业务流程中,可通过以下 3 种方式将消息发送给 IBM MQ:
teamworks.MQMessages
Java™服务 putMessage
方法,该方法可立即用在 integration.jar
文件中。此选项是最简单的方法,但它提供的自定义能力非常有限。为了允许访问,您必须在 IBM MQ 中,将 IBM BPM Java 流程运行时使用的用户 ID 和 IBM BPM 主机添加到服务连接通道授权中。 MQMessages
类无法满足您的需求,那么可以考虑一个 Java 服务,使用自定义 Java Message Service (JMS) 客户端来向 IBM MQ 发送消息。像任何 JMS 客户端一样对待自定义 JMS 客户端。JMS 客户端类需要打包在 .jar 文件中,包含在业务流程应用程序中。IBM MQ 资源必须在 JMS 客户端所使用的 IBM BPM 服务中定义。 本教程中提供的示例代码演示了如何使用选项 1,如何使用 MQMessages
类。参见图 2。
图 2. Credit Check Service 图中的 MQMessages 类示例
点击查看大图
关闭 [x]
MQMessages
类打包在可立即用在 System Data 工具包中的 integration.jar
文件中。 putMessagemethod
用于通过 PUT 将消息提交到 IBM MQ。在 Properties 选项卡中,单击 Data Mapping 来配置连接到 IBM MQ 所需的自定义设置,如图 3 所示。
图 3. putMessage 数据映射的示例
回页首
当一个业务流程需要等待一条 IBM MQ 消息,然后才能继续执行流程流中的下一步时,这通常使用 BPD 中的消息事件来实现,该事件被设计用于等待消息到达。消息事件被附加到一个幕后的代理,在将消息放入 IBM MQ 队列中时需要触发该代理。IBM BPM 运行时环境使用了一个内部事件管理器 JMS 队列来接收消息事件。
在业务流程中,可通过以下 3 种方式从 IBM MQ 接收消息并触发幕后代理:
MQMessages
类中的 getMessage 方法。此方法具有与 putMessage 方法相同的限制,自定义能力有限。从 IBM MQ 收到消息后,您可以使用 Invoke UCA 活动触发附加到等待消息代理的幕后代理。 本教程中的以下示例演示了选项 1 和 3。选项 2 需要 IBM BPM Advanced,没有在本教程的示例中演示。
选项 1 的好处是,您不需要理解内部事件管理器 JMS 队列的细节和消息格式细节。不足之处包括您具有有限的自定义选择,而且必须手动启动或调度该服务(这些示例中显示了 IBM MQ Get Service)。
使用选项 3 的好处是,MDB 可以不断监视 IBM MQ 队列。只要有消息到达该队列,MDB 就会运行。另外,还可以使用用于 MDB 和 JMS 的完整的 API 集合。不足之处在于,需要花费额外的精力将消息发送到内部 JMS 事件管理器队列,才能触发幕后的代理。
图 4 和图 5 展示了如何使用一个集成服务,该服务在 MQMessages
类中使用了 getMessage
方法。从 IBM MQ 收到消息后,使用 Invoke UCA 活动触发附加到等待消息代理的幕后代理。
图 4. MQMessage 类中的 getMessage 方法
图 5. getMessage 方法数据映射
点击查看大图
关闭 [x]
从图 4 和图 5 可以看到,调用 MQMessages.getMessage
方法后,消息保存在 tw.local.mqMessage
返回值中,并被解析用来获取信用评分信息。然后,调用 Invoke UCA 活动来触发幕后代理。
可从本教程中下载的代码示例使用了一个信用卡申请场景,该场景包含一个信用评分检查服务提供商。使用该代码示例,您可以使用逗号分割的消息格式 customerSSN,creditScore
直接将消息发送到回复队列,模拟信用评分服务提供商。解析消息脚本,如清单 1 所示。
清单 1. 解析 IBM MQ 消息的示例
varsplittedString = tw.local.mqMessage.split(","); tw.local.customerSSN = splittedString[0]; tw.local.creditScore = Number(splittedString[1]);
在解析消息后,幕后代理将启动并使用图 6 所示的映射。
图 6. 幕后代理输入
将同一个幕后代理实现附加到 BPD 中的消息事件中,使用 customerSSN
字符串作为关联键,如图 7 所示。
图 7. 消息事件的幕后代理数据映射
从 IBM MQ 接收消息的另一个选择是使用 MDB。图 8 显示了使用 MDB 触发幕后代理的事件流。
图 8. 使用 MDB 触发幕后代理
MDB 在一个单独的 J2EE 应用程序中运行,该应用程序在 IBM BPM 服务器上运行,充当着 IBM MQ 与业务流程之间的桥梁。该 bean 从 IBM MQ 接收消息,处理消息,然后通过 JMS 将另一条消息发送到内部 IBM BPM 事件管理器队列。该消息为消息事件触发幕后代理,推动流程继续运行。
幕后代理定义需要指定一个唯一的事件消息名称(例如 creditScoreMessage
,如图 9 所示)。
图 9. 幕后代理定义
点击查看大图
关闭 [x]
内部 IBM BPM 事件管理器队列的 JMS 资源定义示例如图 10 中的管理控制台示例所示。事件管理器队列是一个 IBM BPM 内部队列。
图 10. IBM BPM 事件管理器队列的 JMS 资源定义
点击查看大图
关闭 [x]
要将消息发送到事件管理器,可通过幕后代理将消息发送到事件管理器队列。将消息数据封装在一种预定义的 XML 结构中,使用 eventmsg 作为根,如清单 2 所示:
清单 2. 事件消息格式
<eventmsg> <event processApp="MQAPP" ucaname="Credit Check UCA">creditScoreMessage</event> <parameters> <parameter> <key>customerSSN</key> <value>123456789</value> </parameter> <parameter> <key>creditScore</key> <value>620</value> </parameter> </parameters> </eventmsg>
有关消息结构的更多信息,请参阅 IBM 知识中心中的 IBM BPM 文档中的 将消息记入 IBM Business Process Manager 事件管理器 。
清单 3 显示了从 IBM MQ 流程读取消息,然后将它发送到事件管理器队列的示例 MDB 代码。
清单 3. 示例 MDB 代码
点击查看代码清单
关闭 [x]
public void onMessage(Message message) { try { TextMessage textMessage = (TextMessage) message; String mqMessageText = textMessage.getText(); String[] splittedString = mqMessageText.split(","); String ssn = splittedString[0]; String creditScore = splittedString[1]; String data="<eventmsg><event processApp=/"MQAPP/" ucaname=/"Credit Check UCA/">creditScoreMessage</event><parameters><parameter><key>customerSSN</key><value>" + ssn + "</value></parameter><parameter><key>creditScore</key><value>" + creditScore + "</value></parameter></parameters></eventmsg>"; System.out.println(" to send data" +"/n"+data); InitialContext ctx=new InitialContext(); QueueConnectionFactory ucaqcf=(QueueConnectionFactory)ctx.lookup ("javax.jms.QueueConnectionFactory"); Queue ucaqueue=(Queue)ctx.lookup("jms/eventqueue"); QueueConnection connection=ucaqcf.createQueueConnection ("bpmdeadmin", "bpmdeadmin"); Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(ucaqueue); TextMessage sendUCAMessage = session.createTextMessage(); sendUCAMessage.setText(data); producer.send(sendUCAMessage); System.out.println("UCAMessage Sent"); } catch (Exception e) { e.printStackTrace(); } }
回页首
示例代码包含一个业务流程 .twx
文件和一个 .ear
文件,您可以将 .twx 文件导入 Process Designer 中,而 .ear 文件包含可安装在 IBM BPM 的应用服务器上的 MDB 源代码。可从本教程的 “下载” 部分下载 code_sample.zip
文件,并解压出这两个文件。
示例代码使用 MyQM
作为 IBM MQ 队列管理器名称,使用 OutgoingQ
作为队列名称来将消息发送到 IBM MQ,使用 IncomingQ
作为队列来从 IBM MQ 接收消息。这些 IBM MQ 资源必须在运行测试之前创建。如果使用任何不同的命名,可以更新业务流程和 MDB 设置中的配置。可以使用图 11 作为示例。
图 11. IBM MQ 配置
该 J2EE 应用程序将 MDB 包含在 “下载” 部分的code_sample.zip文件中的 .ear
文件中。在安装该文件之前,必须创建 IBM MQ JMS 队列资源,指向在 IBM MQ 中定义的 IncomingQ
队列和应用服务器的 MDB 激活规范,如图 12 所示。
图 12. 针对 IBM MQ JMS 队列资源的 IBM BPM 服务器配置
图 13 显示了使用 MDB 安装示例代码的 MDB 激活规范配置。
图 13. MDB 激活规范
点击查看大图
关闭 [x]
然后,使用如图 14 中所示的 MDB 设置来安装 .ear
文件。
图 14. MDB 监听器绑定
点击查看大图
关闭 [x]
该企业归档 (EAR) 应用程序已安装,但尚未启动。
在 Process Designer 中,导入 .twx
文件,单击 Start 启动 Credit Card Application Process 流程的一个实例。在检查器中,可以看到消息发送到 IBM MQ,令牌正在消息事件上等待传入的 IBM MQ 消息。
图 15 显示了业务流程中等待 IBM MQ 消息到达的位置。
图 15. 正在消息事件上等待的流程
点击查看大图
关闭 [x]
在 IBM MQ Explorer 中,检查 OutgoingQ
队列,以查看发送的消息。
现在您可以测试两种选项如何接收 IBM MQ 消息(使用 MQMessages
类和使用 MDB)。
首先,使用 IBM MQ Explorer 将一条消息放在 IncomingQ
队列中,模拟将消息放在队列中的信用评分服务提供商。请记住,需要使用逗号分割的消息格式,因此这里将一条 123456789,620
消息放在队列中。在此示例中, 123456789
是客户 SSN, 620
是信用评分。客户 SSN 已在流程开头的 Gather Customer Info
脚本中设置。可以更新该脚本来提供不同的 SSN,但是,随后需要确保在测试时向 IBM MQ 发送了一条不同的消息。
接下来,从 Process Designer 运行 IBM MQ Get Service 服务。可以看到流程实例的令牌已转移到 Approval 人工服务,因为业务规则要求在信用评分低于 650 时需要获得经理批准。
您需要启动一个新的 BPD 实例来执行测试。首先,更新 Gather Customer Info
脚本来提供一个不同的 customerSSN
,例如 987654321
。然后启动新 BPD 实例。该流程实例在 Wait for Credit Score 消息事件上等待。
接下来,将一条 98765432,700
消息放在 IncomingQ
队列中,该消息等待 MDB 获取。在管理控制台中,启动之前安装的 JMSUCATest 应用程序。返回到 Process Designer 中,您会看到该流程实例已在流程图中前进到 end 节点。因为信用评分为 700,所以不需要获得经理批准。
回页首
本教程介绍了通过 IBM MQ 在业务流程与其他系统之间发送和接收消息的不同方式的优缺点。在解释了向 IBM MQ 发送消息的 3 种方式后,随后的章节通过一个示例逐步演示了如何使用 MQMessages
将消息发送到 IBM MQ。在解释从 IBM MQ 接收消息的 3 种方式后,教程中还演示了两个示例:使用 MQMessages
类和 Invoke UCA 活动,以及使用 MDB 触发幕后代理。
可以通过从本教程下载的示例代码,对通过 IBM MQ 从业务流程发送和接收消息执行更多的测试。
现在,在计划如何集成 IBM BPM 与 IBM MQ 时,您应该已经知道了如何确定哪个选项最适合您的应用程序。
感谢 Madhu Channapatna 为本教程提供的宝贵的技术评审。
回页首
描述 | 名字 | 大小 |
---|---|---|
代码示例 | code_sample.zip | 1459KB |