Hi.

I'm about to commit a change that will alter the behaviour of the AMQP 0-10 Java client during failover. To be specific, the mechanics of client failover, despite some shared classes and packages (FailoverPolicy for example) differ greatly between 0-8/0-9 and 0-10. The earlier client connection delegate classes use of the AMQProtocolHandler, as well as the FailoverHandler continuation which ran after losing broker connectivity, is not present in the 0-10 delegate. This means that the CountdownLatch created and held by the *protocol* handler is never created, so methods which try to call AMQConnection#blockUntilNotFailingOver() or #isFailingOver() will receive incorrect results.

I have raised QPID-3008 as follows:

https://issues.apache.org/jira/browse/QPID-3008
In the 0-10 Java client when a QueueBrowser returns an Enumeration, and it is being enumerated over while the connection fails over, the consumer cannot tell that failover is ocurring and sends messages with incorrect subscriber tag numbers to the broker. The BasicMessageConsumer_0_10 uses the shared BasicMessageConsumer#acquireReceiving(boolean) method which tries to call AMQConnection#isFailingOver() and #blockUntilNotFailingOver () and receives incorrect results. This is because AMQConnectionDelegate_0_10 does not start a FailoverHandler continuation and therefore the AMQProtocolHandler#setFailoverLatch (CountdownLatch) and associated methods are never called.

To correct this behaviour update the connection close method of the 0-10 delegate to create the latch, attempt failover and then decrement and remove the latch on success.


I am fairly confident that this will not result in any issues with the C++ broker failover or cluster behaviour, but would like to know if anyone thinks this change could cause problems? The particular test is QueueBrowserAutoAckTest#testFailoverWithQueueBrowser() and is excluded only from the cpp.noprefetch profile, and this may be why...?

Finally, I note that while enumerating messages on a queue browser, when it calls #receiveBrowse(), a 0-8 consumer will cause #receive(0) to be called to obtain the next message, whereas a 0-10 consumer will call #receiveNoWait() instead.

Can anyone tell me whether the blocking or non-blocking behaviour is correct?

Cheerz,
Andrew.
--
-- andrew d kennedy ? do not fold, bend, spindle, or mutilate ;
-- http://grkvlt.blogspot.com/ ? edinburgh : +44 7582 293 255 ;


---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to