I'm trying to use ActiveMQ with XA and a Spring configuration. I'm now at the point where DefaultMessageListenerContainer seems to be confusing local and global transactions ...
12:37:58,173 WARN PooledSession:112 - Caught exception trying rollback() when putting session back into the pool: javax.jms.TransactionInProgressException: Cannot rollback() inside an XASession javax.jms.TransactionInProgressException: Cannot rollback() inside an XASession at org.apache.activemq.ActiveMQXASession.rollback(ActiveMQXASession.java:76) at org.jencks.amqpool.PooledSession.close(PooledSession.java:109) at org.jencks.amqpool.XaConnectionPool$Synchronization.afterCompletion(XaConnectionPool.java:89) at bitronix.tm.BitronixTransaction.fireAfterCompletionEvent(BitronixTransaction.java:382) at bitronix.tm.BitronixTransaction.rollback(BitronixTransaction.java:220) at bitronix.tm.BitronixTransactionManager.rollback(BitronixTransactionManager.java:105) at org.springframework.transaction.jta.JtaTransactionManager.doRollback(JtaTransactionManager.java:1054) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:800) at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:777) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.rollbackOnException(AbstractPollingMessageListenerContainer.java:385) at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:243) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:944) at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:875) at java.lang.Thread.run(Thread.java:595) Honestly, I'm not even sure why it is trying to do transactions at this point because there is nothing in the queues. here is my Spring config: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.2.0.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-2.5.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <jaxws:endpoint id="voiceRequest" implementor="com.ess.tts.voicerequest.VoiceRequestImpl" address="/voiceRequest" /> <amq:broker useJmx="false"> <amq:persistenceAdapter> <amq:journaledJDBC dataDirectory="amq"/> </amq:persistenceAdapter> <amq:transportConnectors> <amq:transportConnector uri="tcp://localhost:0" /> </amq:transportConnectors> </amq:broker> <amq:systemUsage> <amq:memoryUsage> <amq:memoryUsage limit="20 mb"/> </amq:memoryUsage> <amq:storeUsage> <amq:storeUsage limit="1 gb"/> </amq:storeUsage> <amq:tempUsage> <amq:tempUsage limit="100 mb"/> </amq:tempUsage> </amq:systemUsage> <amq:queue id="amqRequestQueue" physicalName="amqRequestQueue"/> <amq:queue id="amqResponseQueue" physicalName="amqResponseQueue"/> <bean id="jmsConnectionFactory" class="org.jencks.amqpool.XaPooledConnectionFactory"> <property name="connectionFactory" ref="jmsFactory" /> <property name="transactionManager" ref="bitronixTransactionManager" /> </bean> <bean id="jmsFactory" class="org.apache.activemq.spring.ActiveMQXAConnectionFactory"> <property name="brokerURL" value="vm://localhost" /> <property name="prefetchPolicy"> <bean class="org.apache.activemq.ActiveMQPrefetchPolicy"> <property name="queuePrefetch" value="1" /> </bean> </property> <property name="redeliveryPolicy"> <bean class="org.apache.activemq.RedeliveryPolicy"> <property name="initialRedeliveryDelay" value="60000" /> <property name="backOffMultiplier" value="2" /> <property name="useExponentialBackOff" value="true" /> <property name="maximumRedeliveries" value="3" /> </bean> </property> </bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="jmsConnectionFactory"/> </bean> <bean id="voiceRequestImpl" class="com.ess.tts.voicerequest.VoiceRequestImpl"> <property name="jmsTemplate" ref="jmsTemplate"/> <property name="requestQueue" ref="amqRequestQueue"/> </bean> <bean id="voiceRequestConsumer" class="com.ess.tts.voicerequest.queue.VoiceRequestConsumer"> <property name="jmsTemplate" ref="jmsTemplate"/> <property name="responseQueue" ref="amqResponseQueue"/> </bean> <bean id="btmConfig" factory-method="getConfiguration" class="bitronix.tm.TransactionManagerServices"> <property name="serverId" value="spring-btm" /> </bean> <bean id="bitronixTransactionManager" factory-method="getTransactionManager" class="bitronix.tm.TransactionManagerServices" depends-on="btmConfig" destroy-method="shutdown" /> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="bitronixTransactionManager" /> <property name="userTransaction" ref="bitronixTransactionManager" /> </bean> <aop:aspectj-autoproxy/> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="voiceRequestSender" expression="execution(String com.ess.tts.voicerequest.VoiceRequestImpl.submitVoiceRequest(..))" /> <aop:pointcut id="messageReceptionOperations" expression="execution(void com.ess.tts..*.onMessage(..)) and target(javax.jms.MessageListener)" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="voiceRequestSender" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="messageReceptionOperations" /> </aop:config> <bean id="voiceResponseConsumer" class="com.ess.tts.voiceresponse.queue.VoiceResponseConsumer" /> <jms:listener-container concurrency="1-5" destination-type="queue" prefetch="1" transaction-manager="transactionManager" connection-factory="jmsConnectionFactory"> <jms:listener destination="amqRequestQueue" ref="voiceRequestConsumer"/> <jms:listener destination="amqResponseQueue" ref="voiceResponseConsumer"/> </jms:listener-container> </beans> Thanks, Steve Maring -- View this message in context: http://www.nabble.com/Cannot-rollback%28%29-inside-an-XASession-tp24058620p24058620.html Sent from the ActiveMQ - User mailing list archive at Nabble.com.