You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Mari <ma...@gmail.com> on 2007/01/26 23:14:48 UTC

InactivityMonitor: Transport connection disconnected "Channel was inactive for too long."

                Sometimes the transport gets disconnected with the message
"Channel was inactive for too long."

	Apparently this is same as reported in
http://www.nabble.com/Channel-was-inactive-for-too-long-t1463069.html#a3971744
and
http://www.nabble.com/Durable-consumer-reconnect-problem-tf1716817.html#a6147014

Version: 4.1

Background:

	The class org.apache.activemq.transport.InactivityMonitor runs monitoring
threads to check the read and write of the transport(TCP for example). If it
hasn't sent the message during the given period, it sends a KeepAliveInfo to
ensure the connectivity. If it doesn't receive the message for a given
duration, then it disconnects the transport. 

	By default, the maximumInactivityDuration is 30000 milliseconds. This is
the time interval between the check for read. That is if an end of the
transport doesn't receive any message for this period, then it will close
the connection. For the read check, the time interval is half of
maximumInactivityDuration i.e. 15000 millisecond. That is if a message was
not sent during this period, it will send a KeepAliveInfo to ensure the
connectivity.


Problem and the recommended fix:

	The InactivityMonitor class uses the flags inReceive and commandReceived
variables in methods readCheck and onCommand. Typically these two methods
are called from different threads. Also, the flags inSend and commandSent
are used in methods oneway and writeCheck. Again these two methods are
called from different threads. But, the synchronization was missing for
these. This seems to be a potential cause for the problem. So,
synchronization has been incorporated for these flag usages. 

	The same class InactivityMonitor is used at both client and server side. In
general, the write check (which sends KeepAliveInfo) happens twice during
the time when the read check happens once. Probably the client and server
machines have performance differences and just to be safer, now the write
check is made to happen thrice during the time when the read check happens
once.


	The original and the changed source files are attached here.

http://www.nabble.com/file/5957/InactivityMonitor_Original.java
InactivityMonitor_Original.java 

http://www.nabble.com/file/5958/InactivityMonitor_changed.java
InactivityMonitor_changed.java 


	Any comments/inputs are welcome.

-- 
View this message in context: http://www.nabble.com/InactivityMonitor%3A-Transport-connection-disconnected-%22Channel-was-inactive-for-too-long.%22-tf3125518.html#a8659798
Sent from the ActiveMQ - User mailing list archive at Nabble.com.