[
https://issues.apache.org/activemq/browse/AMQ-1438?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_40345
]
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
xaResource.isSameRM(((WrapperNamedXAResource)other).xaResource);
}
return false;
}
The hang is because this method invokes
org,apache.activemq.ActiveMQConnection.getResourceManagerId()
This method is shown below
public String getResourceManagerId() throws JMSException {
waitForBrokerInfo();
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 {
brokerInfoReceived.await();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
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;
brokerInfoReceived.countDown();
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;
prePeerSetQueue=peer.prePeerSetQueue;
if(tl==null){
prePeerSetQueue.add(command);
}else{
tl.onCommand(command);
}
}
protected void asyncOneWay(Object command) throws IOException{
messageQueue=getMessageQueue();
try{
messageQueue.put(command);
wakeup();
}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
lost.
VMTransport vmtransport=server.connect();
IntrospectionSupport.setProperties(vmtransport,options);
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: https://issues.apache.org/activemq/browse/AMQ-1438
> 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.