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。問題解決。