Reputation: 1
We are trying to create a XA connection pool using Active MQ 5.10.0, camel 2.13.1 running on JBoss EAP 6.2. When the connections are released to the pool the Exception below is thrown. According to other threads this bug was fixed with Active MQ 5.8.x. Any idea why we still get the error? Active MQ client and server are running with 5.10.0.
Spring Config:
<!-- JBoss TX Manager -->
<bean id="jtaTxManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:/TransactionManager" />
</bean>
<bean id="jmsXaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
<property name="brokerURL" value="$camelProp{brokerUrl}" />
<property name="userName" value="$camelProp{queueUsername}" />
<property name="password" value="$camelProp{queuePw}" />
</bean>
<bean id="pooledXAConnectionFactory" class="org.apache.activemq.pool.XaPooledConnectionFactory"
init-method="start" destroy-method="stop">
<property name="maxConnections" value="$camelProp{queue.maxConnections}" />
<property name="connectionFactory" ref="jmsXaConnectionFactory" />
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledXAConnectionFactory" />
<property name="concurrentConsumers" value="$camelProp{queue.concurrentConsumers}" />
<!-- define the jms consumer/producer as transacted -->
<property name="transacted" value="true" />
<!-- setup the transaction manager to use -->
<property name="transactionManager" ref="jtaTxManager" />
</bean>
<!-- define our activemq component -->
<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig" />
</bean>
Exception:
12:45:06,277 WARN [org.apache.activemq.jms.pool.PooledSession] (http-localhost/127.0.0.1:8180-1) Caught exception trying rollback() when putting session back into the pool, will invalidate. javax.jms.TransactionInProgressException: Cannot rollback() inside an XASession: javax.jms.TransactionInProgressException: Cannot rollback() inside an XASession at org.apache.activemq.ActiveMQXASession.rollback(ActiveMQXASession.java:78) [activemq-client-5.10.0.jar:5.10.0] at org.apache.activemq.jms.pool.PooledSession.close(PooledSession.java:116) [activemq-jms-pool-5.10.0.jar:5.10.0] at org.springframework.jms.connection.JmsResourceHolder.closeAll(JmsResourceHolder.java:215) [spring-jms-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.springframework.jms.connection.ConnectionFactoryUtils$JmsResourceSynchronization.releaseResource(ConnectionFactoryUtils.java:412) [spring-jms-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.springframework.jms.connection.ConnectionFactoryUtils$JmsResourceSynchronization.releaseResource(ConnectionFactoryUtils.java:389) [spring-jms-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.springframework.transaction.support.ResourceHolderSynchronization.afterCompletion(ResourceHolderSynchronization.java:98) [spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.springframework.transaction.support.TransactionSynchronizationUtils.invokeAfterCompletion(TransactionSynchronizationUtils.java:168) [spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.springframework.transaction.support.AbstractPlatformTransactionManager.invokeAfterCompletion(AbstractPlatformTransactionManager.java:994) [spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCompletion(AbstractPlatformTransactionManager.java:969) [spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:800) [spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) [spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:148) [spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE] at org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:174) [camel-spring-2.13.1.jar:2.13.1] at org.apache.camel.spring.spi.TransactionErrorHandler.processInTransaction(TransactionErrorHandler.java:134) [camel-spring-2.13.1.jar:2.13.1] at org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:103) [camel-spring-2.13.1.jar:2.13.1] at org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:112) [camel-spring-2.13.1.jar:2.13.1] at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) [camel-core-2.13.1.jar:2.13.1] at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) [camel-core-2.13.1.jar:2.13.1] at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:105) [camel-core-2.13.1.jar:2.13.1] at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:87) [camel-core-2.13.1.jar:2.13.1] at org.apache.camel.component.cxf.CxfConsumer$1.syncInvoke(CxfConsumer.java:136) [camel-cxf-2.13.1.jar:2.13.1] at org.apache.camel.component.cxf.CxfConsumer$1.invoke(CxfConsumer.java:77) [camel-cxf-2.13.1.jar:2.13.1] at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58) [cxf-api-2.7.10.jar:2.7.10] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [rt.jar:1.7.0_65] at java.util.concurrent.FutureTask.run(FutureTask.java:262) [rt.jar:1.7.0_65] at org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) [cxf-api-2.7.10.jar:2.7.10] at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:107) [cxf-api-2.7.10.jar:2.7.10] at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) [cxf-api-2.7.10.jar:2.7.10] at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) [cxf-api-2.7.10.jar:2.7.10] at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1] at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262) [cxf-rt-transports-http-2.7.10.jar:2.7.10] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_65]
Upvotes: 0
Views: 1923
Reputation: 725
I have changed the configurations as below, and it fixes the similar problem i was facing;
<bean id="jmsXAConnectionFactory"
class="org.apache.activemq.ActiveMQXAConnectionFactory"
p:brokerURL="tcp://${activemq.host}:${activemq.port}" />
<bean id="xa.connectionFactory" class="com.atomikos.jms.AtomikosConnectionFactoryBean"> <!-- connection pool -->
<property name="uniqueResourceName" value="amq1" />
<property name="xaConnectionFactory" ref="jmsXAConnectionFactory" />
</bean>
<bean id="jmsConfig"
class="org.apache.camel.component.jms.JmsConfiguration"
p:connectionFactory-ref="xa.connectionFactory"
p:concurrentConsumers="${concurrent.consumers.default}"
p:transactionManager-ref="transactionManager"
p:transacted="true"
p:cacheLevelName="CACHE_CONNECTION"/>
<!-- we are using JMS component from apache-camel -->
<bean id="jms"
class="org.apache.activemq.camel.component.ActiveMQComponent"
p:configuration-ref="jmsConfig" />
</beans>
And we are using gradle to build the project; Atomikos dependencies are below
compile "com.atomikos:transactions-jms:4.0.6"
compile "com.atomikos:transactions-jta:4.0.6"
compile "com.atomikos:transactions-jdbc:4.0.6"
Upvotes: 0
Reputation: 7067
There's something weird going on within that transaction. One thing that I do know is that your config is not quite correct.
The JmsConfig bean needs to have transacted="false"
- the property name is a bit misleading as it actually means "manage this transaction locally" (it just sets the transactedSession property on the underlying spring DefaultMessageListenerContainer, refer to this)
Also you need to set the transactionManager on the PooledConnectionFactory (I'm pretty sure if you ran a debugger on this at the moment the transactionManager on the ActiveMQClient will be null).
Here's a working example I've got running at the moment (EAP 6.2 and AMQ 5.9)
<bean id="jmsXaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory">
<property name="brokerURL" value="${amq.broker.url}?jms.prefetchPolicy.all=1"/>
<property name="userName" value="${amq.broker.connection.user}" />
<property name="password" value="${amq.broker.connection.password}" />
<property name="redeliveryPolicy">
<bean class="org.apache.activemq.RedeliveryPolicy">
<property name="maximumRedeliveries" value="0"/>
</bean>
</property>
</bean>
<bean id="jmsPoolConnectionFactory" class="org.apache.activemq.pool.XaPooledConnectionFactory">
<property name="maxConnections" value="12" />
<property name="connectionFactory" ref="jmsXaConnectionFactory" />
<property name="transactionManager" ref="jtaTransactionManager" />
</bean>
<bean id="jtaTransactionManager" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:/TransactionManager" />
<property name="lookupOnStartup" value="false" />
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.transaction.TransactionManager" />
</bean>
<bean id="userTransaction" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:jboss/UserTransaction" />
<property name="lookupOnStartup" value="false" />
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.transaction.UserTransaction" />
</bean>
<bean name="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="jtaTransactionManager" />
<property name="userTransaction" ref="userTransaction" />
</bean>
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="configuration" ref="jmsTxConfig" />
</bean>
<bean id="jmsTxConfig"
class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="jmsPoolConnectionFactory"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="transacted" value="false"/>
<property name="cacheLevelName" value="CACHE_CONNECTION"/>
</bean>
Upvotes: 1