簡體   English   中英

javax.jms.TransactionInProgressException:無法在JBoss EAP 6.2和Active MQ 5.10.0上的XASession內進行rollback()

[英]javax.jms.TransactionInProgressException: Cannot rollback() inside an XASession on JBoss EAP 6.2 and Active MQ 5.10.0

我們正在嘗試使用在JBoss EAP 6.2上運行的Active MQ 5.10.0和camel 2.13.1創建XA連接池。 將連接釋放到池后,將引發以下異常。 根據其他線程,此錯誤已通過Active MQ 5.8.x修復。 知道為什么我們仍然會收到錯誤嗎? Active MQ客戶端和服務器以5.10.0運行。

彈簧配置:

  <!-- 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> 

例外:

12:45:06,277警告[org.apache.activemq.jms.pool.PooledSession](http-localhost / 127.0.0.1:8180-1)將會話放回池中時嘗試rollback()捕獲的異常將無效。 javax.jms.TransactionInProgressException:無法在XASession中回滾:javax.jms.TransactionInProgressException:無法在org.apache.activemq.ActiveMQXASession.rollback(ActiveMQXASession.java:78)的XASession中回滾()[activemq-client-5.10在org.apache.activemq.jms.pool.PooledSession.close(PooledSession.java:116)的.0.jar:5.10.0] [activemq-jms-pool-5.10.0.jar:5.10.0]在org.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]在org.springframework.jms.connection.ConnectionFactoryUtils $ JmsResourceSynchronization.releaseResource(ConnectionFactoryUtils.java:389)[spring-jms -3.2.8.RELEASE.jar:3.2.8.RELEASE],位於org.springframework.transaction.support.ResourceHolderSynchronization.afterCompletion(ResourceHolderSynchro nization.java:98)[spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE]在org.springframework.transaction.support.TransactionSynchronizationUtils.invokeAfterCompletion(TransactionSynchronizationUtils.java:168)[spring-tx-3.2 .8.RELEASE.jar:3.2.8.RELEASE],位於org.springframework.transaction.support.AbstractPlatformTransactionManager.invokeAfterCompletion(AbstractPlatformTransactionManager.java:994)[spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE ],網址為org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCompletion(AbstractPlatformTransactionManager.java:969)[spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE],網址為org.springframework.transaction.support.AbstractPlatformTransactionManager。 processCommit(AbstractPlatformTransactionManager.java:800)[spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE]在org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)[spring-tx -3.2.8.RELEASE.jar:3.2.8.RELEASE]在org.springframewor k.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:148)[spring-tx-3.2.8.RELEASE.jar:3.2.8.RELEASE]位於org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate( TransactionErrorHandler.java:174)[camel-spring-2.13.1.jar:2.13.1]在org.apache.camel.spring.spi.TransactionErrorHandler.processInTransaction(TransactionErrorHandler.java:134)[camel-spring-2.13.1 .jar:2.13.1],位於org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:103)[camel-spring-2.13.1.jar:2.13.1],位於org.apache.camel。 org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)上的spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:112)[camel-spring-2.13.1.jar:2.13.1] [camel -org-apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)處的-core-2.13.1.jar:2.13.1] [org.org處的camel-core-2.13.1.jar:2.13.1]。 apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.ja va:105)[camel-core-2.13.1.jar:2.13.1]位於org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:87)[camel-core-2.13.1.jar:2.13 .1]在org.apache.camel.component.cxf.CxfConsumer $ 1.syncInvoke(CxfConsumer.java:136)[camel-cxf-2.13.1.jar:2.13.1]在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]在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)[rt.jar:1.7.0_65]在java.util.concurrent.FutureTask.run (FutureTask.java:262)[rt.jar:1.7.0_65]在org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37)[cxf-api-2.7.10.jar:2.7.10]在org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorCha)上的org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:107)[cxf-api-2.7.10.jar:2.7.10] in.java:272)[cxf-api-2.7.10.jar:2.7.10]在org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)[cxf-api-2.7.10.jar :2.7.10],位於org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)[cxf-rt-transports-http-2.7.10.jar:2.7.10],位於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]在org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)[cxf-rt -transports-http-2.7.10.jar:2.7.10],位於org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)[cxf-rt-transports-http-2.7.10.jar :2.7.10],位於org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)[cxf-rt-transports-http-2.7.10.jar:2.7.10],位於org.a pache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)[cxf-rt-transports-http-2.7.10.jar:2.7.10]在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],位於org.apache.cxf.transport.servlet.AbstractHTTPServlet.service( AbstractHTTPServlet.java:262)[cxf-rt-transports-http-2.7.10.jar:2.7.10]在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295)[jbossweb-7.2.2 .final-redhat-1.jar:7.2.2.Final-redhat-1]位於org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)[jbossweb-7.2.2.Final-redhat-1 .jar:7.2.2.Final-redhat-1],位於org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)[jbossweb-7.2.2.Final-redhat-1.jar:7.2.2 .final-redhat-1]位於org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149)[jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1 ] 在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]在org.apache.catalina上的org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145)[jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1] .valves.ErrorReportValve.invoke(ErrorReportValve.java:97)[jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]位於org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:102)[jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336 )[jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]在org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)[jbossweb-7.2。 2.Final-redhat-1.jar:7.2.2.Final-redhat-1],位於org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:653)[jbossweb-7.2.2.Final- redhat-1.jar:7.2。 2.Final-redhat-1],位於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],位於java.lang.Thread.run(Thread.java:745)[rt.jar:1.7.0_65]

該交易中發生了一些奇怪的事情。 我確實知道的一件事是您的配置不太正確。

JmsConfig bean需要具有transacted="false" -屬性名稱有點誤導,因為它實際上意味着“本地管理此事務”(它只是在底層的Spring DefaultMessageListenerContainer上設置了transactedSession屬性,請參閱this )。

另外,您還需要在PooledConnectionFactory上設置transactionManager(我很確定您是否在ActiveMQClient上的transactionManager為空時對此運行調試器)。

這是我目前正在運行的一個有效示例(EAP 6.2和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> 

我更改了如下配置,它解決了我面臨的類似問題;

<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>

我們正在使用gradle構建項目; Atomikos依賴項如下

compile "com.atomikos:transactions-jms:4.0.6"
compile "com.atomikos:transactions-jta:4.0.6"
compile "com.atomikos:transactions-jdbc:4.0.6"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM