Thanks Gary for the, as usual, helpful information.

It looks like the broker maybe suffering from exactly the same problem we encountered when implementing client-side failover. Namely that when the master broker went down a subsequent read on the socket by the client would hang (well actually take a very long time to fail/timeout). In that case our TCP connection was ESTABLISHED and looking at the broker I see the same thing after the client host goes away (the connection is ESTABLISHED). We fixed this issue in our client by setting the socket option SO_RCVTIMEO on the connection to the broker.

I noted what the broker appears to do the same thing with the TCP transport option soTimeout. It looks like when this is set it winds up as a call to java.net.Socket.setSoTimeout when the socket is getting initialized. I have not done any socket programming in Java but my assumption is that SO_TIMEOUT maps to both SO_RCVTIMEO and SO_SNDTIMEO in the C world.

I was hopeful with this option but when I set in in my transport connector:

<transportConnector name="stomp" uri="stomp://mmq1:61613?soTimeout=60000"/>

the timeout does not occur. I actually ran my test case about 15 hours ago and I can still see that the broker still has an ESTABLISHED connection to the dead client and has a message dispatched to it.

Am I miss understanding what soTimeout is for? I can see in org.apache.activemq.transport.tcp.TcpTransport.initialiseSocket that setSoTimeout is getting called unconditionally. So what I'm wondering is if it is actually calling it with a 0 value despite the way I set up my transport connector. I suppose setting this to 0 would explain why it apparently never times out where in our client case it eventually did timeout (because we were not setting the option at all before).




On 04/14/2010 05:15 AM, Gary Tully wrote:
The re-dispatch is triggered by the tcp connection dying, netstat can help with the diagnosis here. Check the connection state of the broker port after the client host is rebooted, if the connection is still active, possibly in a timed_wait state, you may need to configure some additional timeout options on the broker side.

On 13 April 2010 19:43, Josh Carlson <jcarl...@e-dialog.com <mailto:jcarl...@e-dialog.com>> wrote:

    I am using client acknowledgements with a prefetch size of 1 with
    no message expiration policy. When a consumer subscribes to a
    queue I can see that the message gets dispatched correctly. If the
    process gets killed before retrieving and acknowledging the
    message I see the message getting re-dispatched (correctly). I
    expected this same behaviour if the host running the process gets
    rebooted or crashes. However, after reboot I can see that the
    message is stuck in the dispatched state to the consumer that is
    long gone. Is there a way that I can get messages re-dispatched
    when a host hosting consumer processes gets re-booted? How does it
    detect the case when a process dies (even with SIGKILL)?

    I did notice that if I increase my prefetch size and enqueue
    another message after the reboot, that activemq will re-dispatch
    the original message. However with prefetch size equal to one the
    message never seems to get re-dispatched.




--
http://blog.garytully.com

Open Source Integration
http://fusesource.com

Reply via email to