[
https://issues.apache.org/jira/browse/AMQNET-293?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12968921#action_12968921
]
Mark Gellings commented on AMQNET-293:
--------------------------------------
Testing trunk with ActiveMQ 5.4.2 and there is still blocking. Unit test on
AMQNET-294 can be used to replicate.
> Consumer is not recovered after failover reconnect if connection had been
> lost in OnMessage (before SendACK)
> ------------------------------------------------------------------------------------------------------------
>
> Key: AMQNET-293
> URL: https://issues.apache.org/jira/browse/AMQNET-293
> Project: ActiveMQ .Net
> Issue Type: Bug
> Components: NMS
> Affects Versions: 1.4.0, 1.4.1
> Environment: Windows XP - however I believe it's not dependent on the
> operating system
> Reporter: Jan Vogelgesang
> Assignee: Timothy Bish
> Fix For: 1.5.0
>
> Attachments: MessageConsumerDirtyPatch.cs, UnitTestAndPatch.zip
>
>
> To reproduce the error write the simple WinForm application in C# with
> listbox (or console app)
> 1. Create the connection: failover:(tcp://localhost:61616?keepAlive=true) and
> start it.
> 2. Create the session and the QueueConsumer for queue e.g. "TestQueue" (in
> default AutoAcknoledged mode)
> 3. For queue consumer set the message listener e.g. OnMessage
> 4. In OnMessage method do something like Sleep(5000) and then display the
> received textMessage (by Invoke add the messge to listbox).
> 5. By means of localhost:8161/admin create the TestQueue and put to this
> queue about 20 persistent text messages.
> 6. Run the application. You should get on the screen new line every 5 seconds.
> 7. Restart the ActiveMQ broker (I'm using 5.3.0.5)
> 8. After restarting the broker you stop receiving the messages.
> 9. Restart broker again. And you will start getting the messages.
> ----------
> The problem is in NMS.
> Most likely when you restart ActiveMQ broker the client app will be in
> OnMessage method (just sleeping there for 5 seconds). When those 5 seconds is
> over then the NMS is trying to SendACK. And this method will not end until
> failover thread successfully reconnect.. For that time there is a lock on the
> unconsumedMessages.SynchRoot (see MessageConsumer.Dispatch method). And this
> fact is painful for another thread which is trying to do the
> unconsumedMessage.Clear() and needs the locked resource. (this thread is
> initated in Connection.OnTransportInterrupted() and it wants to call
> ClearMessagesInProgress on MessageConsumer).
> The worst thing is that the MessageConsumer.ClearMessagesInProgress method
> cannot call (as waits for locked resource)
> TransportInterruptionProcessingComplete() which I guess registers consumers
> which have to be recovered when the connection is back.
> So when the connection is back:
> SendAck completes
> Failover thread DoRecover but does not find our consumer.
> Dispatch method unlocks the unconsumedMessages.SynchRoot
> The working thread registers consumers to be recovered (absolutely too
> late!!!!)
>
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.