Only the Destination, Connection, and ConnectionFactory objects support
concurrent usage per the JMS 1.1 spec. If you want to share a Sessions
across multiple threads then you should create an object to manage
synchronous access to any JMS objects which do not support this (i.e.
Session).

-Trevor


stirlingc wrote:
> 
> Hello,
> 
> The JavaDoc for ActiveMQSession states that it is a single-threaded class. 
> Mr. Strachan re-iterates in this message about ensuring that each thread
> has its own session and producers/consumers:
> 
> http://www.nabble.com/Re%3A-Help%21-Missing-messages-in-Multithreaded-producer-p12535029s2354.html
> 
> However, is it acceptable for thread A to create  a session S and pass it
> to thread B?  Thread A never accesses S again, and thread B is responsible
> for closing S.  In other words, S is used in a single-threaded manner, but
> its user is a different thread from the one that created it.
> 
> ----
> 
> The reason I ask is I have a scenario where I want queue messages to be
> processed in parallel by a self-managed thread pool (i.e., the number of
> threads grows and contracts depending on load).  The wrinkle is that I
> want each thread to be able to roll back its assigned message; in other
> words, each thread has to have its own session.
> 
> I've thought about using a dispatcher thread that creates a session and
> then calls MessageConsumer.receive() to block until a message arrives. 
> Upon message arrival, the dispatcher passes the session and message to a
> pooled thread for processing.  The pooled thread is responsible for
> committing/rolling back and closing the session.  As soon as the pooled
> thread starts, the dispatcher thread creates a new session/consumer, and
> the process repeats.
> 
> In this scenario, a session is only used by a single pooled thread, but it
> is created by the dispatcher thread.  Is this OK or are there ThreadLocals
> or other tricks that might be broken by doing this?
> 
> I've seen a similar solution where the dispatcher thread uses
> MessageListener.onMessage(), but I think that is even more problematic
> since the ActiveMQSession JavaDoc specifically mentions that the caller of
> onMessage() must be the sole user of the session (which is violated by the
> pooled thread).
> 
> The only other solution I can think of is to launch all my pooled threads
> at once and have each of them create their own session/consumer and block
> on receive().  Each pooled thread would then completely process a message
> before re-blocking on another receive().  However, this does not allow me
> to use an expanding/contracting thread pool.
> 
> Thanks for the help!
> 

-- 
View this message in context: 
http://www.nabble.com/Is-it-ever-OK-to-use-a-session-*synchronously*-from-more-than-one-thread--tp15750184s2354p15784127.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to