SimpleMessageListener 与 DirectMessageListener

SimpleMessageListener vs DirectMessageListener

我想看看 DirectMessageListenerSimpleMessageListener 之间的区别。有这张图就是想问一下对不对

让我试着描述一下我是如何理解它的,也许你会告诉我它是否正确。

spring-rabbit前面有rabbit-clientjava库,它正在连接到rabbit-mq服务器并向spring-rabbit库传递消息。该客户端有一些 ThreadPoolExecutor(我认为在本例中有 16 个线程)。因此,rabbit 中有多少个队列并不重要——如果只有一个连接,我会得到 16 个线程。如果我使用 DirectMessageListener,这些相同的线程将被重用 - 当消息到达时,此处理程序方法 listen 在所有这 16 个线程中执行。因此,如果我在处理程序中做一些复杂的事情,rabbit-client 必须等待线程释放才能使用该线程获取下一条消息。另外,如果我将 setConsumersPerQueue 增加到 20,它会为每个队列创建 20 个消费者,但不会创建线程。在我的案例中,这 20*5 个消费者将全部重用 ThreadPoolExecutor?

提供的这 16 个线程

SimpleMessageListener 另一方面,会有自己的线程。如果并发消费者 == 1(我想我的情况是默认值)它只有一个线程。每当 secondUseCase* 队列中的任何一个有消息时,rabbit-client java 库将使用它的 16 个线程之一,将消息转发到我在 SimpleMessageListener。转发后,rabbit-client java 库线程被释放,它可以返回从 rabbit 服务器获取更多消息。

你的理解是正确的。

主要区别在于,使用 DMLC,所有侦听器容器中的所有侦听器都在 amqp-client 中的共享线程池上调用(如果需要,您可以增加 16 个)。您需要确保池足够大以处理您预期的跨所有容器的并发,否则您将饿死。

因为线程是共享的,效率更高。

使用 SMLC,您不必担心这一点,但代价是每个并发都有一个线程。在那种情况下,amqp-client 中的一个小池通常就足够了。