[ 
https://issues.apache.org/activemq/browse/AMQ-731?page=comments#action_36226 ] 

Christopher G. Stach II commented on AMQ-731:
---------------------------------------------

Okay, here's a bit more information.  While stepping through a rollback, I've 
found l.elementData in TransactionContext.rollback(Xid) to contain 24 entries 
for the _same_ TransactionContext.  The loop at line 407 iterates over all of 
these, calling afterRollback on each.  afterRollback calls 
Synchronization.afterRollback at ActiveMQSession line 706 where redelivery is 
evaluated.  Since max redeliveries is set at 9 and there are 24 entries, the 
redeliveries are exhausted before this loop completes.

So, the question is, why 24 entries?


> Redeliveries don't work with resource adapter and Jencks
> --------------------------------------------------------
>
>          Key: AMQ-731
>          URL: https://issues.apache.org/activemq/browse/AMQ-731
>      Project: ActiveMQ
>         Type: Bug

>   Components: Connector
>     Versions: 4.0
>  Environment: Sun JDK 1.5.0_06, Jencks 1.1.3, AMQ 4.0, Resin Pro 3.0.14
>     Reporter: Christopher G. Stach II

>
>
> During a rollback in a JTA transaction, this exception is generated a few 
> times:
> org.apache.activemq.broker.AbstractConnection.serviceException Async
> error occurred: javax.jms.JMSException: Could not correlate
> acknowledgment with dispatched message: MessageAck {commandId = 137,
> responseRequired = false, ackType = 1, consumerId =
> ID:xxx-2276-1148335783189-2:5:-1:2, firstMessageId =
> ID:xxx-2276-1148335783189-2:1:1:1:2, lastMessageId =
> ID:xxx-2276-1148335783189-2:1:1:1:2, destination = queue://xxxQueue,
> transactionId = null, messageCount = 1}
> javax.jms.JMSException: Could not correlate acknowledgment with
> dispatched message: MessageAck {commandId = 137, responseRequired =
> false, ackType = 1, consumerId = ID:xxx-2276-1148335783189-2:5:-1:2,
> firstMessageId = ID:xxx-2276-1148335783189-2:1:1:1:2, lastMessageId =
> ID:xxx-2276-1148335783189-2:1:1:1:2, destination = queue://xxxQueue,
> transactionId = null, messageCount = 1}
>         at
> org.apache.activemq.broker.region.PrefetchSubscription.acknowledge(PrefetchSubscription.java:175)
>         at
> org.apache.activemq.broker.region.AbstractRegion.acknowledge(AbstractRegion.java:233)
>         at
> org.apache.activemq.broker.region.RegionBroker.acknowledge(RegionBroker.java:362)
>         at
> org.apache.activemq.broker.TransactionBroker.acknowledge(TransactionBroker.java:176)
>         at
> org.apache.activemq.broker.BrokerFilter.acknowledge(BrokerFilter.java:65)
>         at
> org.apache.activemq.broker.BrokerFilter.acknowledge(BrokerFilter.java:65)
>         at
> org.apache.activemq.broker.MutableBrokerFilter.acknowledge(MutableBrokerFilter.java:78)
>         at
> org.apache.activemq.broker.AbstractConnection.processMessageAck(AbstractConnection.java:356)
>         at org.apache.activemq.command.MessageAck.visit(MessageAck.java:178)
>         at
> org.apache.activemq.broker.AbstractConnection.service(AbstractConnection.java:201)
>         at
> org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:62)
>         at
> org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:97)
>         at
> org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:63)
>         at
> org.apache.activemq.transport.vm.VMTransport.oneway(VMTransport.java:76)
>         at
> org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:44)
>         at
> org.apache.activemq.transport.ResponseCorrelator.oneway(ResponseCorrelator.java:60)
>         at
> org.apache.activemq.ActiveMQConnection.asyncSendPacket(ActiveMQConnection.java:1111)
>         at
> org.apache.activemq.ActiveMQSession.asyncSendPacket(ActiveMQSession.java:1655)
>         at
> org.apache.activemq.ActiveMQSession$2.afterRollback(ActiveMQSession.java:720)
>         at
> org.apache.activemq.TransactionContext.afterRollback(TransactionContext.java:134)
>         at
> org.apache.activemq.TransactionContext.rollback(TransactionContext.java:409)
>         at
> org.apache.activemq.ra.LocalAndXATransaction.rollback(LocalAndXATransaction.java:126)
>         at
> org.apache.geronimo.transaction.manager.WrapperNamedXAResource.rollback(WrapperNamedXAResource.java:78)
>         at
> com.caucho.transaction.TransactionImpl.rollbackInt(TransactionImpl.java:787)
>         at
> com.caucho.transaction.TransactionImpl.commit(TransactionImpl.java:560)
>         at org.jencks.XAEndpoint.afterDelivery(XAEndpoint.java:103)
>         at
> org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.afterDelivery(MessageEndpointProxy.java:125)
>         at
> org.apache.activemq.ra.MessageEndpointProxy.afterDelivery(MessageEndpointProxy.java:64)
>         at
> org.apache.activemq.ra.ServerSessionImpl.afterDelivery(ServerSessionImpl.java:214)
>         at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:751)
>         at
> org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:163)
>         at com.caucho.jca.WorkThread.run(WorkThread.java:99)
>         at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:490)
>         at com.caucho.util.ThreadPool.run(ThreadPool.java:423)
>         at java.lang.Thread.run(Thread.java:595) 
> Note that the ackType is a poison ack.  This shouldn't be the case as the 
> configuration (below) on the resource adapter and the managed connection 
> factory both specify 9 redeliveries.  Redelivery does not happen.
> Broker configuration:
> <?xml version="1.0" encoding="UTF-8"?>
> <beans xmlns="http://activemq.org/config/1.0";>
>         <broker persistent="false" useJmx="false">
>                 <transportConnectors>
>                         <transportConnector uri="vm://localhost" />
>                 </transportConnectors>
>                 <persistenceAdapter>
>                         <memoryPersistenceAdapter />
>                 </persistenceAdapter>
>         </broker>
> </beans>
> Spring configuration:
>         <bean id="jms.connectionFactory"
> class="org.springframework.jca.support.LocalConnectionFactoryBean">
>                 <property name="connectionManager">
>                         <bean 
> class="com.xxx.jca.ResinConnectionManagerFactoryBean">
>                                 <property name="localTransaction">
>                                         <value>false</value>
>                                 </property>
>                                 <property name="localTransactionOptimization">
>                                         <value>false</value>
>                                 </property>
>                                 <property name="managedConnectionFactory">
>                                         <ref 
> local="jms.managedConnectionFactory" />
>                                 </property>
>                                 <property name="xaTransaction">
>                                         <value>true</value>
>                                 </property>
>                         </bean>
>                 </property>
>                 <property name="managedConnectionFactory">
>                         <ref local="jms.managedConnectionFactory" />
>                 </property>
>         </bean>
>         <bean id="jms.jcaContainer" class="org.jencks.JCAContainer">
>                 <property name="bootstrapContext">
>                         <bean 
> class="com.xxx.jca.ResinBootstrapContextFactoryBean" />
>                 </property>
>                 <property name="resourceAdapter">
>                         <ref local="jms.resourceAdapter" />
>                 </property>
>         </bean>
>         <bean id="jms.managedConnectionFactory"
> class="org.apache.activemq.ra.ActiveMQManagedConnectionFactory">
>                 <property name="allPrefetchValues">
>                         <value>1</value>
>                 </property>
>                 <property name="initialRedeliveryDelay">
>                         <value>2000</value>
>                 </property>
>                 <property name="maximumRedeliveries">
>                         <value>9</value>
>                 </property>
>                 <property name="redeliveryBackOffMultiplier">
>                         <value>2</value>
>                 </property>
>                 <property name="redeliveryUseExponentialBackOff">
>                         <value>true</value>
>                 </property>
>                 <property name="resourceAdapter">
>                         <ref local="jms.resourceAdapter" />
>                 </property>
>         </bean>
>         <bean id="jms.broker" 
> class="org.apache.activemq.xbean.BrokerFactoryBean">
>                 <property name="config">
>                         <value>classpath:activemq.xml</value>
>                 </property>
>                 <property name="start">
>                         <value>true</value>
>                 </property>
>         </bean>
>         <bean id="jms.resourceAdapter"
> class="org.apache.activemq.ra.ActiveMQResourceAdapter"
> depends-on="jms.broker">
>                 <property name="allPrefetchValues">
>                         <value>1</value>
>                 </property>
>                 <property name="initialRedeliveryDelay">
>                         <value>2000</value>
>                 </property>
>                 <property name="maximumRedeliveries">
>                         <value>9</value>
>                 </property>
>                 <property name="redeliveryBackOffMultiplier">
>                         <value>2</value>
>                 </property>
>                 <property name="redeliveryUseExponentialBackOff">
>                         <value>true</value>
>                 </property>
>                 <property name="serverUrl">
>                         <value>vm://localhost</value>
>                 </property>
>         </bean>
> I have written a test case using Geronimo's TM, but it succeeds.  The 
> configuration is very different, so I don't think it can be attributed to 
> just a simple change in TM.  A lot of other configuration changes had to be 
> made.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   https://issues.apache.org/activemq/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to