activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Manu T George (JIRA)" <>
Subject [jira] Commented: (AMQ-1438) When in XA Transaction Active-MQ integrated with OpenEJB hangs in the isSameRM method of LocalAndXATransaction.
Date Thu, 11 Oct 2007 10:44:24 GMT


Manu T George commented on AMQ-1438:

I believe I owe an explanation for the JIRA.

The problem faced is a hang in the method below when the Geronimo TM calls it.

   public boolean isSameRM(XAResource other) throws XAException {
       if (other instanceof WrapperNamedXAResource) {
       return false;

The hang is because this method invokes org,apache.activemq.ActiveMQConnection.getResourceManagerId()

This method is shown below

    public String getResourceManagerId() throws JMSException {
        if( brokerInfo==null )
            throw new JMSException("Connection failed before Broker info was received.");
        return brokerInfo.getBrokerId().getValue();

The waitForBrokerInfo() method is shown below

 private void waitForBrokerInfo() throws JMSException {
        try {
        } catch (InterruptedException e) {
            throw JMSExceptionSupport.create(e);

Once await is called on brokerInfoReceived which is a countdown latch currently brokerInfoReceived.countDown()
never gets called. Actually this should get called on the 
else if ( command.isBrokerInfo() ) {
                this.brokerInfo = (BrokerInfo)command;
                this.optimizeAcknowledge &= !this.brokerInfo.isFaultTolerantConfiguration();

block of the onCommand method of org.apache.activemq.ActiveMQConnection.

This is not getting called. 

On investigating and with some help from AMQ IRC , I found that there are two methods in org.apache.activemq.transport.vm.VMTransport.
They are given below

    protected void syncOneWay(Object command){
        final TransportListener tl=peer.transportListener;
    protected void asyncOneWay(Object command) throws IOException{
        }catch(final InterruptedException e){
            log.error("messageQueue interupted",e);
            throw new IOException(e.getMessage());

The problem here is even when i set async=true for the VMTransport when the command BrokerInfo
is sent syncOneWay is called. At that time TransportListener tl=null. So it gets added to
prePeerSetQueue. The reason for this happening is that in org.apache.activemq.transport.vm.VMTransportFactory
when the below lines are called a brokerInfo is sent as server.connect() is called. The async=true
is not yet set resulting in the syncOneWay getting called. Only after that IntrospectionSupport.setProperties(vmtransport,options);
is called and async is set to true. Due to this inconsistency the BrokerInfo command gets

VMTransport vmtransport=server.connect();

I hope I made the issue clear. Can someone verify the patch or make a fix for this.

> When in XA Transaction Active-MQ integrated with OpenEJB hangs in the isSameRM method
of LocalAndXATransaction. 
> ----------------------------------------------------------------------------------------------------------------
>                 Key: AMQ-1438
>                 URL:
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Connector, Transport
>    Affects Versions: 4.1.1
>         Environment: All
>            Reporter: Manu T George
>            Priority: Critical
>             Fix For: 4.1.2
>         Attachments: AMQ-1438.patch
>  I was facing a problem with the AMQ 4.1 with the LocalAndXATransaction class's isSameRM
waiting indefinitely. The wait is because waitForBrokerInfo calls brokerInfoReceived.await()
> where brokerInfoReceived is a countdown latch. Once this is waiting it
> never gets resumed.
> To trigger it the method onCommand(final Object o) has to be called on
> org.apache.activemq.ActiveMQConnection. 

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

View raw message