跳到主要内容

接收消息

DeepSeek V3 中英对照 Receiving Messages

消息接收总是比发送稍微复杂一些。接收 Message 有两种方式。较简单的方式是使用轮询方法调用,一次轮询一个 Message。更复杂但更常见的方法是注册一个侦听器,按需异步接收 Messages。我们将在接下来的两个小节中分别举例说明这两种方式。

章节小结

📄️ 轮询消费者

AmqpTemplate 本身可以用于轮询式的消息接收。默认情况下,如果没有可用的消息,它会立即返回 null,不会进行阻塞。从 1.5 版本开始,你可以设置一个 receiveTimeout(以毫秒为单位),接收方法会阻塞最多这么长时间,等待消息的到来。如果值小于零,则表示无限期阻塞(或者至少阻塞到与代理的连接丢失为止)。1.6 版本引入了接收方法的变体,允许在每次调用时传递超时时间。

📄️ 选择一个容器

版本 2.0 引入了 DirectMessageListenerContainer(DMLC)。之前,只有 SimpleMessageListenerContainer(SMLC)可用。SMLC 使用内部队列和每个消费者专用的线程。如果容器配置为监听多个队列,则使用相同的消费者线程来处理所有队列。并发性由 concurrentConsumers 和其他属性控制。当消息从 RabbitMQ 客户端到达时,客户端线程通过队列将消息传递给消费者线程。这种架构是必要的,因为在早期版本的 RabbitMQ 客户端中,无法实现多个并发传递。较新版本的客户端改进了线程模型,现在可以支持并发性。这使得引入 DMLC 成为可能,现在监听器直接在 RabbitMQ 客户端线程上调用。因此,它的架构实际上比 SMLC 更“简单”。然而,这种方法有一些限制,SMLC 的某些功能在 DMLC 中不可用。此外,并发性由 consumersPerQueue(以及客户端库的线程池)控制。concurrentConsumers 和相关的属性在此容器中不可用。