随本文提供的下载文件是 Message Broker Toolkit 项目交换文件,提供了以下所示的简单消息流:
此消息流包括 Java Compute 节点,该节点使用所介绍的技术来支持数据库表的简单插入操作。要运行此示例,请执行以下操作:
- 下载 ZIP 文件,然后使用 File => Import => Project Interchange,将其作为 Porject Interchange 导入您的 Message Broker Toolkit。
- 打开
MB_JCN_JDBCXA项目中的消息文件MB_JCN_JDBCXA.msgflow和 Java 类JavaComputeJdbcXa(该类实现 Java Compute 节点)。对其进行复查,注意JavaComputeJdbcXa.evaluate()方法所进行的工作:- 确保消息流经过验证(请参见
doValidation())。 - 直接将输入消息复制到输出中。
- 获取 JDBC 连接(请参见
getConnection())。 - 在 DB2 示例数据库
SAMPLE的EMPLOYEE表中插入行(请参见insertEmployee())。 - 执行测试,验证连接的确是采用 XA。
- 确保消息流经过验证(请参见
- 按照上面所讨论的为协调 JDBC 事务准备数据库系统。如果在未针对 XA 协调进行设置的情况下部署和运行流,Message Broker 将发出错误:
"BIP2633" Warning when starting transaction coordinated by WebSphere MQ; MQBEGIN failed: MQCC=1; MQRC=2122; node 'MB_JCN_JDBCXA.MQInput.
,其中 MQRC 为:C:\Program Files\IBM\MQSI\6.0.0.3>mqrc 2122 2122 0x0000084a MQRC_PARTICIPANT_NOT_AVAILABLE C:\Program Files\IBM\MQSI\6.0.0.3> - 在数据库中创建带
EMPLOYEE表的 DB2SAMPLE数据库。MB_JCN_JDBCXA项目中还提供了Database\employee.ddl文件。db2 => CREATE TABLE "EMPLOYEE" ("EMPNO" CHAR(6) NOT NULL , "FIRSTNME" VARCHAR(12) NOT NULL ,"MIDINIT" CHAR(1) NOT NULL , "LASTNAME" VARCHAR(15) NOT NULL , "EDLEVEL" SMALLINT NOT NULL ) DB20000I The SQL command completed successfully. db2 => commit work DB20000I The SQL command completed successfully. db2 => connect reset DB20000I The SQL command completed successfully. - 在 Broker Queue Manager 上为流创建输入和输出 MQ 队列。
MB_JCN_JDBCXA项目中提供了Queues\queues.mqc文件。def ql(MB_JCN_JDBCXA_IN) bothresh(3) replace def ql(MB_JCN_JDBCXA_OUT) replace - 创建包含
MB_JCN_JDBCXA消息流的 BAR 文件。然后设置 Coordinated Transaction 和 Additional Instances 属性:
如果在未设置 Coordinated Transaction 的情况下部署流,Java 代码验证将引发用户异常,并导致拒绝所有消息输入:
Java exception: 'com.ibm.broker.plugin.MbUserException'; thrown from class name: 'com.ibm.mbJcnJdbcXa.JavaComputeJdbcXa', method name: 'doValidation', file: 'JavaComputeJdbcXa.java', line: '128'; trace text: 'Incorrect setup Flow is not setup for coordinated Transaction'; resource bundle: 'com.ibm.mbJcnJdbcXa.JcnJdbcXaMessages'; key: 'DB2JDBCXATEST_FAILURE';
然后设置以下用户定义属性,从而向 Java 提供数据库名称及部署环境的访问凭证细节:
- 将创建的 BAR 文件部署到代理,并检查是否存在任何错误消息。
- 将包含任意有效 XML 的测试消息放在流输入队列
MB_JCN_JDBCXA_IN上。 - 确认消息得到了处理,并被复制到输出队列
MB_JCN_JDBCXA_OUT,而且在SAMPLE数据库的EMPLOYEE表中创建了新行。
db2 => SELECT * FROM EMPLOYEE EMPNO FIRSTNME MIDINIT LASTNAME EDLEVEL ------ ------------ ------- --------------- ------- 4131 MSGBRK M JDBCXA 22 1 record(s) selected. db2 =>>
如果未创建新行,则请检查系统事件日志确定原因。如果创建了新行,将使用 XA 协调执行事务,因为 Java 代码将通过确保拒绝本地回滚来执行设置的验证。
- 必须使用 DB2 "App" JDBC Type 2 驱动程序的 DriverManager 接口获得协调连接——实例化
COM.ibm.db2.jdbc.app.DB2Driver类的实例。所有通过这种方式建立的连接将基于在流上进行的Coordinated Transaction设置来进行协调。 - 只有分布式平台可用于此配置中——此方法在 z/OS® 上不可行。我们只对 Windows 和 AIX 进行测试。
- 混合 JDBC / ODBC 消息流不能用于此配置。
- 在 Message Broker 线程上注册了 XA 资源后,就不能再次对其进行注册。如果尝试重新部署流,可能会得到 MQRC 2195 错误。解决方法是,直接将部署的子项从执行组删除,然后重新部署 BAR 文件。
- 必须在此配置中使用的 DB2 type 2 "App" JDBC 类并不实现任何连接池操作,因此将为使用 Java Compute 节点(建立到 JDBC XA 源的连接)运行流的每个 Message Broker 线程保留 JDBC 连接。
本文介绍了如何在 WebSphere Message Broker V6 Java Compute 节点中实现访问 DB2 数据库的协调事务,从而支持采用标准 JDBC 编写代码,使得构建能在 Message Broker 和其他 Java 环境(如 WebSphere Application Server)中部署的公用 Java 数据访问层成为可能。本文还提供了将解决方案付诸实践的示例项目,能够部署此项目并验证其成功操作。