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.

Reply via email to