RabbitMQ Java 客户端有以下概念:
Connection
Channel
我试图理解这种关系, 更重要 的是,它们之间的 关联 。
AConnection表示到消息代理的真实 TCP 连接,而 aChannel是其中的虚拟连接(AMQP 连接)。这样,您可以在应用程序中使用任意数量的(虚拟)连接,而不会因 TCP 连接而使代理过载。
你可以用一个Channel来做任何事情。但是,如果您有多个线程,建议Channel为每个线程使用不同的线程。
Java 客户端 API 指南中的通道线程安全:
通道实例可以安全地被多个线程使用。对 Channel 的请求是序列化的,一次只有一个线程能够在 Channel 上运行命令。即便如此,应用程序应该更喜欢每个线程使用一个 Channel,而不是在多个线程之间共享同一个 Channel。
Channel和之间没有直接关系Queue。AChannel用于向代理发送 AMQP 命令。这可以是队列或类似的创建,但这些概念并没有联系在一起。
Queue
Consumer
也可以将其附加Consumer到多个队列。您可以将消费者理解为回调。每次消息到达消费者绑定的队列时都会调用这些。对于 Java Client 来说,每个 Consumer 都有一个 method handleDelivery(...),代表回调方法。您通常做的是子类化DefaultConsumer和覆盖handleDelivery(...)。注意:如果将同一个 Consumer 实例附加到多个队列中,该方法将被不同的线程调用。因此,如有必要,请注意同步。
handleDelivery(...)
DefaultConsumer