When I send message with camel-activemq component to standalone
ActiveMQ Broker on different pc via TCP everything work fine in my route
until I disconnect JMSproducer from network for check some connection
problem. Some time I got error Activemq not received current message
process and database not rollback.
Trace here.
DEBUG: org.apache.camel.component.ibatis.IBatisPollingConsumer - Processing
exchange: Exchange[Message:
83,POSWH-102-01,PRV,PVPR-102-0912/0001,2009-12-16,KW-0002,0.0,5.0,5.0,insert,,null,null,null,null,null,RED]
DEBUG: org.apache.camel.spring.spi.TransactionErrorHandler - Transaction
begin (0x1b213a5) for ExchangeId: e988b09e-74b0-46b1-845e-47a7bc384912
DEBUG: java.sql.Connection - {conn-100043} Connection
DEBUG: java.sql.Connection - {conn-100043} Preparing Statement: update
MovingProductStock set statusSending = true where stockId = ?
DEBUG: java.sql.PreparedStatement - {pstm-100044} Executing Statement:
update MovingProductStock set statusSending = true where stockId = ?
DEBUG: java.sql.PreparedStatement - {pstm-100044} Parameters: [83]
DEBUG: java.sql.PreparedStatement - {pstm-100044} Types: [java.lang.Long]
DEBUG: org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate -
Executing callback on JMS Session: ActiveMQSession
{id=ID:Pond-NB-50196-1274328136594-0:1:42,started=false}
DEBUG: org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate -
Sending JMS message to: queue://allmovingproductstock with message:
ActiveMQObjectMessage {commandId = 0, responseRequired = false, messageId =
null, originalDestination = null, originalTransactionId = null, producerId =
null, destination = null, transactionId = null, expiration = 0, timestamp =
0, arrival = 0, brokerInTime = 0, brokerOutTime = 0, correlationId = null,
replyTo = null, persistent = false, type = null, priority = 0, groupID =
null, groupSequence = 0, targetConsumerId = null, compressed = false, userID
= null, content = org.apache.activemq.util.byteseque...@8af514,
marshalledProperties = null, dataStructure = null, redeliveryCounter = 0,
size = 0, properties = {CamelIBatisResult=1,
CamelIBatisStatementName=updateProcessedMovingProductStock},
readOnlyProperties = false, readOnlyBody = false, droppable = false}
DEBUG: org.apache.activemq.TransactionContext - Start:
192.168.0.28.tm0002100011192.168.0.28.tm42
DEBUG: org.apache.activemq.TransactionContext - Started XA transaction:
XID:1096044365:3139322e3136382e302e32382e746d30303032313030303131:3139322e3136382e302e32382e746d3432
####################### Commiting Transaction ####################
DEBUG: org.apache.activemq.TransactionContext - End:
192.168.0.28.tm0002100011192.168.0.28.tm42
DEBUG: org.apache.activemq.TransactionContext - Ended XA transaction:
XID:1096044365:3139322e3136382e302e32382e746d30303032313030303131:3139322e3136382e302e32382e746d3432
DEBUG: org.apache.activemq.TransactionContext - Prepare:
192.168.0.28.tm0002100011192.168.0.28.tm42
DEBUG: org.apache.activemq.TransactionContext - Commit:
192.168.0.28.tm0002100011192.168.0.28.tm42
DEBUG: org.apache.activemq.transport.InactivityMonitor - 9998 ms elapsed
since last write check.
DEBUG: org.apache.activemq.transport.InactivityMonitor - 10000 ms elapsed
since last write check.
DEBUG: org.apache.activemq.transport.InactivityMonitor - 10001 ms elapsed
since last write check.
DEBUG: org.apache.activemq.transport.InactivityMonitor - 30001 ms elapsed
since last read check.
DEBUG: org.apache.activemq.transport.InactivityMonitor - 10000 ms elapsed
since last write check.
DEBUG: org.apache.activemq.transport.InactivityMonitor - 30001 ms elapsed
since last read check.
DEBUG: org.apache.activemq.ActiveMQConnection - Async exception with no
exception listener: java.net.SocketException: Software caused connection
abort: recv failed
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at
org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBufferedInputStream.java:50)
at
org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.java:527)
at
org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBufferedInputStream.java:58)
at
org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.java:512)
at java.io.DataInputStream.readInt(DataInputStream.java:370)
at
org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:269)
at
org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:211)
at
org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:203)
at
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:186)
at java.lang.Thread.run(Thread.java:619)
DEBUG: org.apache.activemq.transport.tcp.TcpTransport - Stopping transport
tcp:///192.168.0.5:61616
DEBUG: org.apache.activemq.transport.InactivityMonitor - 10000 ms elapsed
since last write check.
DEBUG: org.apache.activemq.transport.InactivityMonitor - 9999 ms elapsed
since last write check.
DEBUG: org.apache.activemq.transport.InactivityMonitor - 10001 ms elapsed
since last write check.
DEBUG: org.apache.activemq.transport.InactivityMonitor - 30001 ms elapsed
since last read check.
DEBUG: org.apache.activemq.transport.tcp.TcpTransport - Stopping transport
tcp:///192.168.0.5:61616
DEBUG: org.apache.activemq.transport.tcp.TcpTransport - Stopping transport
tcp://null:0
DEBUG: org.apache.activemq.TransactionContext - Commit:
192.168.0.28.tm0002100011192.168.0.28.tm42
DEBUG: org.apache.activemq.transport.tcp.TcpTransport - Stopping transport
tcp://null:0
DEBUG: org.apache.activemq.TransactionContext - Commit:
192.168.0.28.tm0002100011192.168.0.28.tm42
DEBUG: org.apache.activemq.transport.tcp.TcpTransport - Stopping transport
tcp://null:0
DEBUG: org.apache.activemq.TransactionContext - Commit:
192.168.0.28.tm0002100011192.168.0.28.tm42
DEBUG: org.apache.activemq.transport.tcp.TcpTransport - Stopping transport
tcp://null:0
DEBUG: org.apache.activemq.TransactionContext - Commit:
192.168.0.28.tm0002100011192.168.0.28.tm42
DEBUG: org.apache.activemq.transport.tcp.TcpTransport - Stopping transport
tcp://null:0
DEBUG: org.apache.activemq.TransactionContext - Commit:
192.168.0.28.tm0002100011192.168.0.28.tm42
DEBUG: org.apache.activemq.transport.tcp.TcpTransport - Stopping transport
tcp://null:0
DEBUG: org.apache.activemq.TransactionContext - Commit:
192.168.0.28.tm0002100011192.168.0.28.tm42
WARN : org.apache.camel.spring.spi.TransactionErrorHandler - Transaction
rollback (0x1b213a5) for ExchangeId: e988b09e-74b0-46b1-845e-47a7bc384912
due exception: Heuristic completion: outcome state is mixed; nested
exception is javax.transaction.HeuristicMixedException: Heuristic Exception
DEBUG: org.apache.camel.processor.DefaultErrorHandler - Failed delivery for
exchangeId: e988b09e-74b0-46b1-845e-47a7bc384912. On delivery attempt: 0
caught: org.springframework.transaction.HeuristicCompletionException:
Heuristic completion: outcome state is mixed; nested exception is
javax.transaction.HeuristicMixedException: Heuristic Exception
ERROR: org.apache.camel.processor.DefaultErrorHandler - Failed delivery for
exchangeId: e988b09e-74b0-46b1-845e-47a7bc384912. Exhausted after delivery
attempt: 1 caught:
org.springframework.transaction.HeuristicCompletionException: Heuristic
completion: outcome state is mixed; nested exception is
javax.transaction.HeuristicMixedException: Heuristic Exception
org.springframework.transaction.HeuristicCompletionException: Heuristic
completion: outcome state is mixed; nested exception is
javax.transaction.HeuristicMixedException: Heuristic Exception
at
org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1016)
at
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147)
at
org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:130)
at
org.apache.camel.spring.spi.TransactionErrorHandler.processInTransaction(TransactionErrorHandler.java:106)
at
org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:84)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
at
org.apache.camel.processor.DelegateProcessor.processNext(DelegateProcessor.java:53)
at
org.apache.camel.processor.DelegateProcessor.proceed(DelegateProcessor.java:82)
at
org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:93)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
at
org.apache.camel.processor.RedeliveryErrorHandler.processExchange(RedeliveryErrorHandler.java:177)
at
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:143)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:88)
at
org.apache.camel.processor.DefaultErrorHandler.process(DefaultErrorHandler.java:49)
at
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:228)
at
org.apache.camel.processor.UnitOfWorkProcessor.processNext(UnitOfWorkProcessor.java:66)
at
org.apache.camel.processor.DelegateProcessor.process(DelegateProcessor.java:48)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:67)
at
org.apache.camel.component.ibatis.IBatisPollingConsumer.processBatch(IBatisPollingConsumer.java:215)
at
org.apache.camel.component.ibatis.IBatisPollingConsumer.poll(IBatisPollingConsumer.java:179)
at
org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:106)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at
java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
at
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
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:619)
Caused by: javax.transaction.HeuristicMixedException: Heuristic Exception
at
com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:300)
at
com.atomikos.icatch.jta.TransactionManagerImp.commit(TransactionManagerImp.java:612)
at
com.atomikos.icatch.jta.UserTransactionImp.commit(UserTransactionImp.java:168)
at
org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1009)
... 31 more
DEBUG: org.apache.camel.processor.DefaultErrorHandler - This exchange is not
handled so its marked as failed: Exchange[Message:
83,POSWH-102-01,PRV,PVPR-102-0912/0001,2009-12-16,KW-0002,0.0,5.0,5.0,insert,,null,null,null,null,null,RED]
All I saw was It try to commit transaction "tm42" when TCP connection lost
Then rollbacked my route but not transaction "tm42". How can I make this
rollback properly?
This is my simple Producer
<camel:camelContext id="camelSender">
<camel:onException>
<camel:exception>org.springframework.jms.UncategorizedJmsException</camel:exception>
<camel:redeliveryPolicy disableRedelivery="true" />
<camel:handled>
<camel:constant>true</camel:constant>
</camel:handled>
<camel:rollback markRollbackOnly="true" />
</camel:onException>
<camel:route id="movingproductstocksender">
<camel:from
uri="ibatis:getUnProcessMovingProductStock?statementType=QueryForList"/>
<camel:transacted/>
<camel:to
uri="ibatis:updateProcessedMovingProductStock?statementType=Update" />
<camel:to
uri="activemq:queue:allmovingproductstock?transactionName=MOVSPRO" />
<camel:to uri="bean:testConnection?method=test" />
</camel:route>
</camel:camelContext>
And this my transaction + component config.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/spring"
xmlns:flex="http://www.springframework.org/schema/flex"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/flex
http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:annotation-config />
<context:component-scan base-package="com.strsoftware">
<context:include-filter type="aspectj"
expression="com.strsoftware.*"/>
</context:component-scan>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- setup property file destination -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="WEB-INF/routing.properties"/>
</bean>
<bean id="amqConnectionFactory"
class="org.apache.activemq.ActiveMQXAConnectionFactory">
<property
name="brokerURL"><value>${brokerURL}</value></property>
<property name="exclusiveConsumer" value="true"/>
<property name="prefetchPolicy" ref="prefetchPolicy"/>
</bean>
<bean id="prefetchPolicy"
class="org.apache.activemq.ActiveMQPrefetchPolicy">
<property name="all" value="0"/>
</bean>
<bean id="connectionFactory"
class="com.atomikos.jms.AtomikosConnectionFactoryBean">
<property name="uniqueResourceName" value="SHOPMQ"/>
<property name="xaConnectionFactory"
ref="amqConnectionFactory"/>
<property
name="maxPoolSize"><value>${maxPoolSize}</value></property>
</bean>
<bean id="jmsConfig"
class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="transacted" value="true"/>
<property name="transactionManager" ref="transactionManager"/>
<property
name="concurrentConsumers"><value>${concurrentConsumers}</value></property>
</bean>
<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig"/>
</bean>
<!-- setup jdbc datasource -->
<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean">
<property name="uniqueResourceName" value="SHOPDB"/>
<property
name="xaDataSourceClassName"><value>${driverClassName}</value></property>
<property
name="maxPoolSize"><value>${maxPoolSize}</value></property>
<property name="testQuery" value="SELECT * FROM TEST"/>
<property name="xaProperties">
<props>
<prop key="url">${url}</prop>
<prop key="user">${username}</prop>
<prop key="password">${password}</prop>
</props>
</property>
</bean>
<!-- setting up sqlMapClient -->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation"
value="WEB-INF/sqlMapConfig.xml" />
<property name="dataSource" ref="dataSource"/>
<property name="useTransactionAwareDataSource" value="true"/>
</bean>
<!-- Setup Ibatis component -->
<bean id="ibatis"
class="org.apache.camel.component.ibatis.IBatisComponent">
<property name="sqlMapClient" ref="sqlMapClient"/>
<property name="useTransactions" value="true"/>
</bean>
<!--
Construct Atomikos UserTransactionManager,
needed to configure Spring
-->
<bean id="atomikosTransactionManager"
class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init">
<!--
when close is called,
should we force transactions to terminate or not?
-->
<property name="forceShutdown" value="false"/>
</bean>
<!--
Also use Atomikos UserTransactionImp,
needed to configure Spring
-->
<bean id="atomikosUserTransaction"
class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
<!--
Configure the Spring framework to use JTA transactions from Atomikos
-->
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager"
/>
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
</beans>
Thank you in advance for your help.
--
View this message in context:
http://old.nabble.com/ActiveMQ-Camel-Component-JMS-producer-can%27t-rollback-transaction.-tp28617182p28617182.html
Sent from the Camel - Users (activemq) mailing list archive at Nabble.com.