On 29 Feb 2008, at 01:26, 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.
Yes - this fine within the JMS spec -section 4.4.6


----

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?

As long as the implementation is compatible with the JMS spec this is ok - and its certainly fine for ActiveMQ
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--tp15750184s2354p15750184.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.





cheers,

Rob

http://open.iona.com/ -Enterprise Open Integration
http://rajdavies.blogspot.com/



Reply via email to