[ 
https://issues.apache.org/activemq/browse/AMQ-1824?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gary Tully resolved AMQ-1824.
-----------------------------

    Resolution: Working as Designed

This test is a demonstration of a limitation of the current geronimo 
transaction manager xid factory. With three JMVs on the same machine executing 
the same code, the transaction identifiers are identical.
The broker sees the same Xid on three connections instead of three separate 
transactions. The problem occurs when a transaction commit occurs before the 
last ack on a connection.

The default geronimo xidFactory impl needs to add some entropy in the form of a 
random to the baseId. The current use of HashCode and IP address for baseId is 
not sufficient. Typically nodes will be on different IP addresses so this will 
not be an issue.
I raised a geronimo issue with a suggested patch:  
https://issues.apache.org/jira/browse/GERONIMO-4393

As a workaround:
there is a constructor argument that allows the baseId to be specified, if this 
makes use of the clientId property, the test works as expected.

{code}
  <bean id="xidFactory" 
class="org.apache.geronimo.transaction.manager.XidFactoryImpl">
        <constructor-arg><value>bla-bla-${clientId}</value></constructor-arg>
  </bean>

  <bean id="transactionManager" 
class="org.jencks.factory.TransactionManagerFactoryBean" lazy-init="default" 
autowire="default" dependency-check="default" >
        <property name="xidFactory" ref="xidFactory" />
  </bean>
{code}

> Single producer and multiple consumer processes, some consumers stop getting 
> messages.
> --------------------------------------------------------------------------------------
>
>                 Key: AMQ-1824
>                 URL: https://issues.apache.org/activemq/browse/AMQ-1824
>             Project: ActiveMQ
>          Issue Type: Bug
>    Affects Versions: 5.1.0
>         Environment: Windows XP SP2, Sun JDK 1.6.03 and RHEL 64 bit Sun 1.6.05
>            Reporter: Jerry Shea
>            Assignee: Gary Tully
>            Priority: Blocker
>             Fix For: 5.3.0
>
>         Attachments: repro_AMQ.zip, repro_AMQ_rf.zip
>
>
> With a single producer and multiple consumer processes using the 
> ActiveMQResourceAdapter (inside Jencks), some consumers stop getting 
> messages. If you look at the JMX counters inside jconsole you can see the 
> stuck subscription's pending queue size increasing. Nearly every time this 
> exception is thrown by one of the failing consumers:
> {noformat}
> 2008-06-25 12:07:29,297 [pool-1-thread-7] WARN  Transaction  - Error ending 
> association for XAResource [EMAIL PROTECTED]; transaction will roll back. XA 
> error code: -7
> javax.transaction.xa.XAException: The connection is already closed
>       at 
> org.apache.activemq.TransactionContext.toXAException(TransactionContext.java:624)
>       at 
> org.apache.activemq.TransactionContext.setXid(TransactionContext.java:559)
>       at 
> org.apache.activemq.TransactionContext.end(TransactionContext.java:339)
>       at 
> org.apache.activemq.ra.LocalAndXATransaction.end(LocalAndXATransaction.java:90)
>       at 
> org.apache.geronimo.transaction.manager.WrapperNamedXAResource.end(WrapperNamedXAResource.java:51)
>       at 
> org.apache.geronimo.transaction.manager.TransactionImpl.endResources(TransactionImpl.java:563)
>       at 
> org.apache.geronimo.transaction.manager.TransactionImpl.endResources(TransactionImpl.java:542)
>       at 
> org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:401)
>       at 
> org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:257)
>       at 
> org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:238)
>       at org.jencks.XAEndpoint.afterDelivery(XAEndpoint.java:105)
>       at 
> org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.afterDelivery(MessageEndpointProxy.java:121)
>       at 
> org.apache.activemq.ra.MessageEndpointProxy.afterDelivery(MessageEndpointProxy.java:63)
>       at 
> org.apache.activemq.ra.ServerSessionImpl.afterDelivery(ServerSessionImpl.java:217)
>       at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:785)
>       at 
> org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:165)
>       at 
> org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:290)
>       at 
> org.apache.geronimo.connector.work.pool.NamedRunnable.run(NamedRunnable.java:32)
>       at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown 
> Source)
>       at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
>       at java.lang.Thread.run(Unknown Source)
> Caused by: org.apache.activemq.ConnectionClosedException: The connection is 
> already closed
>       at 
> org.apache.activemq.ActiveMQConnection.checkClosed(ActiveMQConnection.java:1271)
>       at 
> org.apache.activemq.ActiveMQConnection.checkClosedOrFailed(ActiveMQConnection.java:1258)
>       at 
> org.apache.activemq.TransactionContext.setXid(TransactionContext.java:556)
>       ... 19 more
> 2008-06-25 12:07:29,297 [pool-1-thread-7] ERROR Transaction  - Unexpected 
> exception rolling back [EMAIL PROTECTED]; continuing with rollback
> javax.transaction.xa.XAException: The connection is already closed
>       at 
> org.apache.activemq.TransactionContext.toXAException(TransactionContext.java:624)
>       at 
> org.apache.activemq.TransactionContext.rollback(TransactionContext.java:423)
>       at 
> org.apache.activemq.ra.LocalAndXATransaction.rollback(LocalAndXATransaction.java:128)
>       at 
> org.apache.geronimo.transaction.manager.WrapperNamedXAResource.rollback(WrapperNamedXAResource.java:78)
>       at 
> org.apache.geronimo.transaction.manager.TransactionImpl.rollbackResources(TransactionImpl.java:581)
>       at 
> org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:267)
>       at 
> org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:238)
>       at org.jencks.XAEndpoint.afterDelivery(XAEndpoint.java:105)
>       at 
> org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.afterDelivery(MessageEndpointProxy.java:121)
>       at 
> org.apache.activemq.ra.MessageEndpointProxy.afterDelivery(MessageEndpointProxy.java:63)
>       at 
> org.apache.activemq.ra.ServerSessionImpl.afterDelivery(ServerSessionImpl.java:217)
>       at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:785)
>       at 
> org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:165)
>       at 
> org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:290)
>       at 
> org.apache.geronimo.connector.work.pool.NamedRunnable.run(NamedRunnable.java:32)
>       at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown 
> Source)
>       at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
>       at java.lang.Thread.run(Unknown Source)
> Caused by: org.apache.activemq.ConnectionClosedException: The connection is 
> already closed
>       at 
> org.apache.activemq.ActiveMQConnection.checkClosed(ActiveMQConnection.java:1271)
>       at 
> org.apache.activemq.ActiveMQConnection.checkClosedOrFailed(ActiveMQConnection.java:1258)
>       at 
> org.apache.activemq.TransactionContext.rollback(TransactionContext.java:407)
>       ... 16 more
> 2008-06-25 12:07:29,297 [pool-1-thread-7] INFO  
> org.apache.activemq.ra.ServerSessionImpl:0  - Endpoint failed to process 
> message. Reason: java.lang.RuntimeException: Endpoint after delivery 
> notification failure
> {noformat}
> I've written some code to reproduce this problem. Instructions:
> 1. unpack the attached source
> 2. build with 'mvn compile package'
> 3. start with ./startAll.sh (I used cygwin) - this will start 1 producer and 
> 3 consumer processes. These programs are pointing to tcp://localhost:62616 
> (you can change this in spring config file)
> Look in jconsole under subscriptions and you will probably see within 1 or 2 
> runs, only 2 consumers being created, or possibly 3 consumers but 1 of them 
> with an increasing pending queue size.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to