2011-06-03 82 views
2

情況是我們希望使用XA事務來協調ActiveMQ和Hibernate(Sql Server 2008)之間的活動。ActiveMQ JMS XA Atomikos - 事務未啓動錯誤

我們使用:

  • 春3.0.5
  • 的Hibernate 3.6.2
  • 的ActiveMQ 5.5.0
  • Atomikos公司3.7

我們看到下面的錯誤越來越在與事務相關的日誌文件中生成的文件尚未啓動。這些總是與JMS相關的。

交易'[ID]'尚未啓動。

這些會一直生成到日誌中。

的問題是在這要複雜得多,我們必須具有相同JMS隊列工作,似乎是錯誤不會只有一個Web應用程序運行時生成3的Web應用程序。

這些部署用於分隔運行在同一臺計算機上的Tomcat 7.0.14的實例。

2011-05-31 15:04:27,065 [Atomikos:30] WARN - [com.atomikos.diagnostics.Slf4jConsole] : XA resource 'XAJMS': rollback for XID '3139322E3136382E302E35332E746D30363636333030303031:3139322E3136382E302E35332E746D36363633' raised 0: unknown 
javax.transaction.xa.XAException: Transaction 'XID:1096044365:3139322e3136382e302e35332e746d30363636333030303031:3139322e3136382e302e35332e746d36363633' has not been started. 
    at org.apache.activemq.TransactionContext.toXAException(TransactionContext.java:732) 
    at org.apache.activemq.TransactionContext.rollback(TransactionContext.java:497) 
    at com.atomikos.datasource.xa.XAResourceTransaction.rollback(XAResourceTransaction.java:690) 
    at com.atomikos.icatch.imp.RollbackMessage.send(RollbackMessage.java:72) 
    at com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:111) 
    at com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:87) 
    at com.atomikos.icatch.imp.Propagator.submitPropagationMessage(Propagator.java:66) 
    at com.atomikos.icatch.imp.HeurHazardStateHandler.onTimeout(HeurHazardStateHandler.java:124) 
    at com.atomikos.icatch.imp.CoordinatorImp.alarm(CoordinatorImp.java:1105) 
    at com.atomikos.timing.PooledAlarmTimer.notifyListeners(PooledAlarmTimer.java:112) 
    at com.atomikos.timing.PooledAlarmTimer.run(PooledAlarmTimer.java:99) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: javax.transaction.xa.XAException: Transaction 'XID:1096044365:3139322e3136382e302e35332e746d30363636333030303031:3139322e3136382e302e35332e746d36363633' has not been started. 
    at org.apache.activemq.broker.TransactionBroker.getTransaction(TransactionBroker.java:290) 
    at org.apache.activemq.broker.TransactionBroker.rollbackTransaction(TransactionBroker.java:177) 
    at org.apache.activemq.broker.MutableBrokerFilter.rollbackTransaction(MutableBrokerFilter.java:131) 
    at org.apache.activemq.broker.TransportConnection.processRollbackTransaction(TransportConnection.java:436) 
    at org.apache.activemq.command.TransactionInfo.visit(TransactionInfo.java:104) 
    at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:306) 
    at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:179) 
    at org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:69) 
    at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113) 
    at org.apache.activemq.transport.InactivityMonitor.onCommand(InactivityMonitor.java:227) 
    at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83) 
    at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:220) 
    at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:202) 
    at java.lang.Thread.run(Unknown Source) 

我們的Spring配置:

<Resource name="jms/ConnectionFactory" 
    auth="Container" 
    type="org.apache.activemq.ActiveMQXAConnectionFactory" 
    description="JMS XA Connection Factory" 
    factory="org.apache.activemq.jndi.JNDIReferenceFactory" 
    brokerURL="tcp://${activemq.server.name}:${activemq.server.port}" 
    brokerName="LocalActiveMQBroker" /> 


<bean id="atomikosConnectionFactory" 
     class="com.atomikos.jms.AtomikosConnectionFactoryBean" 
     init-method="init" destroy-method="close"> 
    <property name="uniqueResourceName" value="XAJMS" /> 
    <property name="xaConnectionFactory" ref="jmsConnectionFactory" /> 
    <property name="maxPoolSize" value="40" /> 
</bean> 

<bean id="getSomeStuffListenerAdapter" 
     class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> 
    <property name="delegate" ref="targetElement" /> 
    <property name="defaultListenerMethod" value="doStuff" /> 
    <property name="messageConverter" ref="myMessageConverter" /> 
</bean> 

<bean id="getSomeStuffListenerContainer" 
     class="org.springframework.jms.listener.DefaultMessageListenerContainer" 
     depends-on="txManager"> 
    <property name="connectionFactory" ref="atomikosConnectionFactory"/> 
    <property name="destination" ref="jmsQueue01"/> 
    <property name="messageListener" ref="getSomeStuffListenerAdapter" /> 
    <property name="concurrency" value="5-10" /> 
    <property name="transactionManager" ref="txManager" /> 
    <property name="sessionTransacted" value="true" /> 
</bean> 

<bean id="atomikosTransactionManager" 
     class="com.atomikos.icatch.jta.UserTransactionManager" 
     depends-on="dataSource, atomikosConnectionFactory" 
     init-method="init" destroy-method="close"> 
    <property name="forceShutdown" value="false" /> 
</bean> 

<bean id="txManager" 
     class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
</bean> 

回答

5

好運行時,在同一臺機器上3個Tomcat Web應用程序,使用Atomikos公司,這是指向同一服務器的ActiveMQ,我們有這個問題。

應用程序在單獨的Atomikos日誌文件的獨立Tomcat實例中運行。

問題是XA XID(事務ID)在三個應用程序中不是唯一的,這導致ActiveMQ感到困惑。這是由於在同一臺機器上運行的實例。

如果您將Atomikos和ActiveMQ日誌記錄設置爲TRACE。然後您可以看到兩個或更多應用程序生成相同的XID。

這是因爲Atomikos公司屬性設置的:com.atomikos.icatch.tm_unique_name

如果沒有設置,那麼生成所述XID,這是對於三個相同的當機器的IP地址被用於應用程序並導致衝突。

這個問題只有在3個Tomcat應用程序開始彼此非常接近時纔可能發生。

因此,將com.atomikos.icatch.tm_unique_name設置爲對每個Web應用程序都是唯一的,並且問題消失。