was 6 与websphere mq6整合以后,由于需要在EJB中(会话bean和消息bean)发送JMS消息到MQ。EJB本身处于容器的jta事务环境中,JMS默认也会被纳入事务管理,所以连接工厂的配置需要选中"已启用xa支持“,该属性将会使JMS的操作支持二阶段提交协议。否则发送消息的操作有可能触发类似如下异常(日志文件丢失,无法列出完整异常信息):
无法在jta环境中使用只支持一阶段的资源。
启用xa支持以后,jms的操作会有较为严格的事务支持,如果事务失败,会被记录到服务器的was/profiles/server1/tranlog中,根据was版本和自定义配置的不同,该文件夹的路径可能会有变化。
当was重启之后,回读取tranlog下的事务记录,试图恢复被挂起的事务,如果该操作无法正确创建xa资源的话,会有如下警告:
==============================================================================
[06-5-12 11:25:25:516 CST] 00000014 XARecoveryDat E WTRN0005W: 无法重新创建事务参与者的 XAResource 且可能无法正确完成事务恢复。资源为:J2CXAResourceInfo :
cfName = JMS$ConnectionFactory$JMSManagedConnection@195100581
configProps = [Deployed Resource Adapter Properties]
TransactionResourceRegistration java.lang.String dynamic
InactiveConnectionSupport java.lang.Boolean true
mcfClassname java.lang.String com.ibm.ejs.jms.WSJMSManagedQueueConnectionFactory
mcfConnectorName java.lang.String JMS$ConnectionFactory
mcfObjectType java.lang.Integer 4
dd = [Resource Adapter DD]
ManagedConnectionFactory Class Name: com.ibm.ejs.jms.JMSManagedQueueSessionFactory
Connection Factory Interface Name: com.ibm.ejs.jms.JMSManagedQueueSessionFactory
Transaction Support: 2
Reauthentication Support: false
dsProps = {MRET=1, HOST=172.16.0.116, PINT=5000, CHAN=c1, CCS=1381, QMGR=sobeymam, FIQ=1, RINT=5000, PORT=1414, UCP=1, TRAN=1}
mcfProps = null
mmProps = null
mbeanProps = null
cmConfig = [Resource-ref settings]
res-auth: 1 (APPLICATION)
res-isolation-level: 0 (TRANSACTION_NONE)
res-sharing-scope: false (UNSHAREABLE)
loginConfigurationName: null
loginConfigProperties: null
[Other attributes]
res-resolution-control: 999 (undefined)
isCMP1_x: false (not CMP1.x)
isJMS: true (JMS)
recoveryClasspath = null
。异常堆栈跟踪遵循:java.lang.NullPointerException
at com.ibm.ejs.j2c.J2CXAResourceFactory.getXAResource(J2CXAResourceFactory.java:173)
at com.ibm.ws.Transaction.JTA.XARecoveryData.recover(XARecoveryData.java:518)
at com.ibm.ws.Transaction.JTA.PartnerLogTable.recover(PartnerLogTable.java:511)
at com.ibm.ws.Transaction.JTA.RecoveryManager.resync(RecoveryManager.java:1784)
at com.ibm.ws.Transaction.JTA.RecoveryManager.run(RecoveryManager.java:2241)
==============================================================================
该恢复操作每分钟执行一次,因此有可能在日志中形成大量的相同警告,虽然不影响使用,但是.......很不好。
解决办法是删除tranlog目录,重启was。问题解决。
无法在jta环境中使用只支持一阶段的资源。
启用xa支持以后,jms的操作会有较为严格的事务支持,如果事务失败,会被记录到服务器的was/profiles/server1/tranlog中,根据was版本和自定义配置的不同,该文件夹的路径可能会有变化。
当was重启之后,回读取tranlog下的事务记录,试图恢复被挂起的事务,如果该操作无法正确创建xa资源的话,会有如下警告:
==============================================================================
[06-5-12 11:25:25:516 CST] 00000014 XARecoveryDat E WTRN0005W: 无法重新创建事务参与者的 XAResource 且可能无法正确完成事务恢复。资源为:J2CXAResourceInfo :
cfName = JMS$ConnectionFactory$JMSManagedConnection@195100581
configProps = [Deployed Resource Adapter Properties]
TransactionResourceRegistration java.lang.String dynamic
InactiveConnectionSupport java.lang.Boolean true
mcfClassname java.lang.String com.ibm.ejs.jms.WSJMSManagedQueueConnectionFactory
mcfConnectorName java.lang.String JMS$ConnectionFactory
mcfObjectType java.lang.Integer 4
dd = [Resource Adapter DD]
ManagedConnectionFactory Class Name: com.ibm.ejs.jms.JMSManagedQueueSessionFactory
Connection Factory Interface Name: com.ibm.ejs.jms.JMSManagedQueueSessionFactory
Transaction Support: 2
Reauthentication Support: false
dsProps = {MRET=1, HOST=172.16.0.116, PINT=5000, CHAN=c1, CCS=1381, QMGR=sobeymam, FIQ=1, RINT=5000, PORT=1414, UCP=1, TRAN=1}
mcfProps = null
mmProps = null
mbeanProps = null
cmConfig = [Resource-ref settings]
res-auth: 1 (APPLICATION)
res-isolation-level: 0 (TRANSACTION_NONE)
res-sharing-scope: false (UNSHAREABLE)
loginConfigurationName: null
loginConfigProperties: null
[Other attributes]
res-resolution-control: 999 (undefined)
isCMP1_x: false (not CMP1.x)
isJMS: true (JMS)
recoveryClasspath = null
。异常堆栈跟踪遵循:java.lang.NullPointerException
at com.ibm.ejs.j2c.J2CXAResourceFactory.getXAResource(J2CXAResourceFactory.java:173)
at com.ibm.ws.Transaction.JTA.XARecoveryData.recover(XARecoveryData.java:518)
at com.ibm.ws.Transaction.JTA.PartnerLogTable.recover(PartnerLogTable.java:511)
at com.ibm.ws.Transaction.JTA.RecoveryManager.resync(RecoveryManager.java:1784)
at com.ibm.ws.Transaction.JTA.RecoveryManager.run(RecoveryManager.java:2241)
==============================================================================
该恢复操作每分钟执行一次,因此有可能在日志中形成大量的相同警告,虽然不影响使用,但是.......很不好。
解决办法是删除tranlog目录,重启was。问题解决。