[rabbitmq-discuss] Channel thread safety in Java client
jiri at krutil.com
Tue Jul 5 09:42:00 BST 2011
I'm trying to understand the limitations of using a Channel in a
multi-threaded application using the Java client. Sorry for this longish
I have read http://www.rabbitmq.com/api-guide.html#channel-threads but
did not find any other, more detailed info.
I want to receive messages by subscription. I create a Channel and
invoke basicConsume() on it, passing a QueueingConsumer.
The moment I call basicConsume(), I would imagine the Channel becomes
"owned" by the client lib's connection thread, which feeds messages to
My app is retrieving those messages from the QueueingConsumer in the
main thread. I would like to know to which extent can I keep using the
Channel passed to basicConsume() from the main thread.
I guess I can use it to ack messages, because ack would not work on
another channel, correct? Can I also use the channel for other things,
such as sending messages, using transactions, or starting another
JMS specs seem to be quite explicit on this. It says a session with an
active subscription is owned by the connection thread and client app
threads cannot use the session; they can only shut it down. That's why
if I want multiple subscriptiopns on one session, I must set them all up
before I call Connection.start(), which passes the session ownership to
the client library. Afterwards I can no longer use the session from my
threads except closing it.
Could you please elaborate on how exactly this works in the rabbit Java
More information about the rabbitmq-discuss