I'm trying to understand how Tomcat's outbound message processing works with 
respect to making multiple (concurrent) calls against a single 
RemoteEndpoint.Async using sendText/sendObject.  Based on the 
ExecutionExceptions we got (see below), it seems that we should probably 
synchronize sends until the Future<>.get() returns, but I want to check with 
the community to be sure.  I tried searching the javadocs of 
RemoteEndpoint.Async and associated interfaces, but could not find anything 
describing the threadsafe nature (existing or not).  It appears that the spec 
lets the implementation determine how to handle stuff under the covers.  This 
is fine, but we just need to understand what that means to multi-threaded code 
that wants to send messages.

Looking at the Tomcat code, it looks like WsRemoteEndpointImplBase uses a 
static SendHandler (i.e. TextMessageSendHandler).  I noticed a little further 
down in the stack the logic does synchronize around a messagePartQueue, but 
this seems to be for handling parts of a single message.  Otherwise, it looks 
like it doesn't expect another message to be sent until it's finished writing 
out.

ExecutionException:
In some recent testing of our client/server Endpoint(s) (using a locally built 
instance of Tomcat 7.0.48), we got ExecutionExceptions when sending messages 
concurrently without any delay.  The errors started with a few Null Ptr(s), 
then were all wsRemoteEndpoint.inProgress (Message will not be sent because the 
WebSocket session is currently sending another message)

Is my understanding correct, or am I missing something?  Thanks in advance for 
any clarification.


Thanks,

Bob DeRemer
http://www.thingworx.com<http://www.thingworx.com/>
Skype: bob.deremer.thingworx

Reply via email to