I think wayne is saying this is a network race condition - where the broker can send the wireformat info before the client starts reading. However, as the client doesn't start reading from the socket until after initializeStreams is called - I'm not sure how the socket will miss the wireformat info from the broker?

On 6 May 2006, at 07:34, James Strachan wrote:

On 4/28/06, Wayne1285 <[EMAIL PROTECTED]> wrote:

I am using ActiveMq-4.0-RC3. I have been having intermittent problems getting sessions created and closed. I have downloaded the code and traced
through it and I think I have found the problem.

There is a race conditon in the TcpTransport class, in the doStart () method. As near as I can tell, as soon as the socket is created, the Broker responds
with its WireFormatInfo.  This information is usually stored as the
remoteWireFormatInfo in the InactivityMonitor. The race condition occurs in
the doStart() method as it appears the broker can sometimes send the
wireFormatInfo before the initializeStreams() method can be called. This results in the information not being capture in the dataIn input buffer.

I just refreshed my memory of the code for TcpTransport and took a
peek at InactivityMonitor. I'm not sure I grok yet the race condition.
TcpTransport only allows itself to be started once and uses a
semaphore around the doStart(); so that all looks good. Also
TcpTransport doesn't allow messages to be sent until the transport is
started (it throws an exception if an attempt is made to send to the
transport before its started).

So I don't quite follow the sequence of events causing the race
condition; is some thread trying to use the TcpTransport before its
been started? If so I don't understand why the checkStarted() method
is not throwing an exception?

--

James
-------
http://radio.weblogs.com/0112098/

Rob Davies
http://rajdavies.blogspot.com/



Reply via email to