Atomikos Community Forum

Not for product support. If you need urgent help with your project then buy development or production support or check the known problems...

Only registered users can post (registration is free). Problems registering? Send an email to support@atomikos.com to get help.


Transaction has not started errors with Spring, JMS and JDBC

The situation is we want to use XA transactions for ActiveMQ and Hibernate (Sql Server 2008).

We are using:

Spring 3.0.5
Hibernate 3.6.2
ActiveMQ 5.5.0
Atomikos 3.7

We are seeing the following errors getting generated in the log file related to the transaction has not been started.  These are always related to JMS.

Transaction '[ID]' has not been started.

These are getting generated into the logs all the time.

The issue is more complicated in that we have 3 web application that work with the same JMS queues and the errors do not seem to be generated when only a single web application is running.

These are deployed to separate instances of Tomcat 7.0.14 running on the same machine.

When monitoring the web application throwing these errors using VisualVM the application was creating 10 new threads per second.  This was without any activity through HTTP or on the ActiveMQ queues.

Stack trace:
011-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)

Our Spring configuration:

JNDI Connection Factory for ActiveMQ

<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>
James Black Send private email
Wednesday, June 01, 2011
 
 
Hi,

This looks like a configuration problem somewhere. Do you have a budget for developer access - so we can put some dedicated time into this?

Thanks
Guy Pardon Send private email
Friday, June 03, 2011
 
 
Hi

unfortunately I do not think the money is available for developer support.

I have been through our config multiple multiple times and so has my colleague we cannot see anything wrong in comparison with examples.

The only difference is we do not set the UserTransaction of the Spring JTATransactionManager, which will be the next thing I try but that should be getting picked up from JNDI anyway.

Cheers.
James Black Send private email
Friday, June 03, 2011
 
 
You also might want to replace the Spring message listener with ours - it works better with XA.
Guy Pardon Send private email
Friday, June 03, 2011
 
 
Can you try with ActiveMQ 5.3.0 instead?
Guy Pardon Send private email
Monday, June 06, 2011
 
 
The same problem occurs with 5.3 as well.  It is the 5.3-snapshot version as the 5.3.0 release download is broke on the ActiveMQ site for all the mirrors.

This is a strange error, we have 3 Tomcat applications that run in separate Tomcats that connect to the same AMQ server using Atomikos.

I do not see this issue if I start one of them but I do see it if I start 3.

Any ideas???
James Black Send private email
Sunday, June 12, 2011
 
 
Problem seems to be fixed, happy days.

The Atomikos JTA Properties documentation defines a property:

com.atomikos.icatch.tm_unique_name

The documentation states it is used when:

"you plan to run more than one transaction manager against one database you must set this property to a unique value or you might run into duplicate transaction ID (XID) problems."

Well because we were running three separate Tomcat applications on the same machine they were all using the same unique_name based on the machine's IP address.

None of these were sharing Atomikos logs so we did not think this property was an issue.

As all our Tomcat (separate instances) were all connected to the same ActiveMQ instance, ActiveMQ was receiving XIDs from different applications that were the same.  This seems to be the source of the "Transaction not started" errors generated by Atomikos.

This is also a subtle issue as it does not necessarily always occur.

It was more likely to occur when we moved to three separate Tomcat instances as opposed to two.

It also seemed to be more likely to happen when the 3 instances were started very close to each other as opposed to being staggered in their start-up.

I hope this helps someone else out so they do not have to go through this pain!
James Black Send private email
Monday, June 13, 2011
 
 
That explains :-) Thanks for sharing!
Guy Pardon Send private email
Tuesday, June 14, 2011
 
 

This topic is archived. No further replies will be accepted.

Other recent topics Other recent topics
 
Powered by FogBugz