The RabbitMQ Java client has the following concepts:
Connection
– a connection to a RabbitMQ server instanceChannel
– ???- Consumer thread pool – a pool of threads that consume messages off the RabbitMQ server queues
- Queue – a structure that holds messages in FIFO order
I'm trying to understand the relationship, and more importantly, the associations between them.
- I'm still not quite sure what a
Channel
is, other than the fact that this is the structure that you publish and consume from, and that it is created from an open connection. If someone could explain to me what the "Channel" represents, it might help clear a few things up. - What is the relationship between Channel and Queue? Can the same Channel be used to communicate to multiples Queues, or does it have to be 1:1?
- What is the relationship between Queue and the Consumer Pool? Can multiple Consumers be subscribed to the same Queue? Can multiple Queues be consumed by the same Consumer? Or is the relationship 1:1?
Best Answer
A
Connection
represents a real TCP connection to the message broker, whereas aChannel
is a virtual connection (AMQP connection) inside it. This way you can use as many (virtual) connections as you want inside your application without overloading the broker with TCP connections.You can use one
Channel
for everything. However, if you have multiple threads, it's suggested to use a differentChannel
for each thread.Channel thread-safety in Java Client API Guide:
There is no direct relation between
Channel
andQueue
. AChannel
is used to send AMQP commands to the broker. This can be the creation of a queue or similar, but these concepts are not tied together.Each
Consumer
runs in its own thread allocated from the consumer thread pool. If multiple Consumers are subscribed to the same Queue, the broker uses round-robin to distribute the messages between them equally. See Tutorial two: "Work Queues".It is also possible to attach the same
Consumer
to multiple Queues. You can understand Consumers as callbacks. These are called everytime a message arrives on a Queue the Consumer is bound to. For the case of the Java Client, each Consumers has a methodhandleDelivery(...)
, which represents the callback method. What you typically do is, subclassDefaultConsumer
and overridehandleDelivery(...)
. Note: If you attach the same Consumer instance to multiple queues, this method will be called by different threads. So take care of synchronization if necessary.