[ 
https://issues.apache.org/jira/browse/AMQ-5340?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14598109#comment-14598109
 ] 

Christopher L. Shannon commented on AMQ-5340:
---------------------------------------------

Thanks for submitting your updated test case, I can see where this an issue now.

[~gtully] and [~tabish121],

This is another interesting issue relating to expired messages.  The problem 
with this test case is the messages are added to the subscription to be 
dispatched but when the subscription goes to dispatch them the logic detects 
the messages are expired so the QueueBrowser client never gets any messages.  
Unfortunately, since the QueueBrowser never receives any messages it never 
sends back any acks and acks are what trigger the logic to send a NULL_MESSAGE 
signaling the browser is done.  This happens in the iterate method in Queue.

So basically the QueueBrowser needs some way to know that it will never receive 
any messages.  The QueueBrowser already calls off to waitForMessage() in the 
hasMoreElements() so using the pullCommand might work here as that would 
trigger the NULL_MESSAGE to get sent back.  However, right now a pull command 
is never sent if prefetch is greater than 0.

> QueueBrowser with expired messages hangs until woken by expired messages 
> background job
> ---------------------------------------------------------------------------------------
>
>                 Key: AMQ-5340
>                 URL: https://issues.apache.org/jira/browse/AMQ-5340
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.9.0, 5.10.0
>            Reporter: Vermeulen
>            Priority: Critical
>              Labels: QueueBrowser
>         Attachments: AMQ5340BrowsingPerformanceBug.java, 
> AMQ5340BrowsingPerformanceBugCorrected.java, AMQ5340BrowsingWithSpring.java
>
>
> I would expect browsing a queue with only a few messages to not take a long 
> time. Indeed it normally takes only a few ms. in my application. But 
> sometimes the ActiveMQQueueBrowser hangs for up to 30 seconds at method 
> before returning!
> When the issue occurs, the loop in hasMoreElements() calls waitForMessage() 
> multiple times which times out after 2s at semaphore.wait(2000) without 
> receiving any message from the broker. I found that when the broker's 
> background job that checks for expired messages runs, the browser happens to 
> be woken even if there are no expired messages. So setting the 
> expireMessagesPeriod to a low value (e.g. 200ms) is a good workaround for 
> this issue, but this is quite brittle because it uses internal broker 
> implementation that may not even be related to the issue!
> To reproduce:
> - (this is what I do in my application) create a queue, send a few message 
> with an expiration time of 10 seconds and repeatedly browse it until it is 
> empty. If I browse the queue after these 10 seconds have passed, the issue 
> occurs!
> - I can always reproduce the issue by running AMQ580BrowsingBug from the 
> related bug report AMQ-4595: this browsing test seems to always hang. I 
> slightly adjusted the test so you can easily change the expired messages 
> period and see the runtime differ when changing this.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to