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.

Reply via email to