activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Carl Allain (JIRA)" <j...@apache.org>
Subject [jira] Commented: (AMQ-2446) Client hangs on receive call with timeout value > 0 when activemq is shutdown (CTRL-C)
Date Fri, 09 Oct 2009 14:24:52 GMT

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

Carl Allain commented on AMQ-2446:
----------------------------------

Hi. I D/L 5.3 RC4 from the link above. I took my application, added the activemq-all-5.3.0.jar
jar in my classpath (before other jars) and I still have the same problem (client hangs).
I can't vote for a 5.3 RC4 without this being fixed ;-). It is just normal that sometimes,
the broker has to be stopped and clients should really not hang like that.

In the mean time, I redesigned portions of my app to use receiveNoWait() + my own thread sleeping
logic (more latency though on new messages added to an empty queue of course) instead of receive(timeout)
and with that, event with the 5.2 version, I get some exceptions that I can use to recover
lost connections, and still use the prefetchSize=0 option on my connection URL.

Still, we have an integration component using Camel on top of ActiveMQ, and for that one,
there is not much I can do.

Thanks.



> Client hangs on receive call with timeout value > 0 when activemq is shutdown (CTRL-C)
> --------------------------------------------------------------------------------------
>
>                 Key: AMQ-2446
>                 URL: https://issues.apache.org/activemq/browse/AMQ-2446
>             Project: ActiveMQ
>          Issue Type: Bug
>    Affects Versions: 5.2.0
>         Environment: Windows XP SP3, ActiveMQ 5.2, prefetchSize=0 (java.naming.provider.url
= tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=0)
>            Reporter: Carl Allain
>
> Start ActiveMQ
> create a message consumer and make a receive(30000) call for example.
> stop ActiveMQ (CTRL-C)
> There is an error reported on the console:
> 2009-10-08 19:23:54,978 [ActiveMQ Transport: tcp://localhost/127.0.0.1:61616] DEBUG org.apache.activemq.ActiveMQConnection
- Async exception with no exception listener: java.io.EOFException
> java.io.EOFException
> 	at java.io.DataInputStream.readInt(DataInputStream.java:358)
> 	at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:269)
> 	at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:210)
> 	at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:202)
> 	at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:185)
> 	at java.lang.Thread.run(Thread.java:595)
> 2009-10-08 19:23:54,978 [ActiveMQ Connection Worker: tcp://localhost/127.0.0.1:61616]
DEBUG org.apache.activemq.transport.tcp.TcpTransport - Stopping transport tcp://localhost/127.0.0.1:61616
> The thread making the receive call is waiting on a mutex that the ActiveMQ Connection
Worker thread that reported that log has (I guess):
> class MessageDispatchChannel
>     public MessageDispatch dequeue(long timeout) throws InterruptedException {
>         synchronized (mutex) {
>             // Wait until the consumer is ready to deliver messages.
>             while (timeout != 0 && !closed && (list.isEmpty() || !running))
{
>                 if (timeout == -1) {
>                     mutex.wait(); <-----------------------------------------------------------
>                 } else {
>                     mutex.wait(timeout);
>                     break;
>                 }
>             }
>             if (closed || !running || list.isEmpty()) {
>                 return null;
>             }
>             return list.removeFirst();
>         }
>     }
> What is also strange to me is that my timeout of 30000 ms is silently converted to an
infinite timeout if the preFetchSize == 0 by this code? Why?
> class ActiveMQMessageConsumer
> ...
>             MessageDispatch md;
>             if (info.getPrefetchSize() == 0) {
>                 md = dequeue(-1); // We let the broker let us know when we
>                 // timeout.
>             } else {
>                 md = dequeue(timeout);
>             }

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


Mime
View raw message