SimpleMessageListener 与 DirectMessageListener
SimpleMessageListener vs DirectMessageListener
我想看看 DirectMessageListener
和 SimpleMessageListener
之间的区别。有这张图就是想问一下对不对
让我试着描述一下我是如何理解它的,也许你会告诉我它是否正确。
在spring-rabbit
前面有rabbit-client
java库,它正在连接到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 中的一个小池通常就足够了。
我想看看 DirectMessageListener
和 SimpleMessageListener
之间的区别。有这张图就是想问一下对不对
让我试着描述一下我是如何理解它的,也许你会告诉我它是否正确。
在spring-rabbit
前面有rabbit-client
java库,它正在连接到rabbit-mq服务器并向spring-rabbit库传递消息。该客户端有一些 ThreadPoolExecutor
(我认为在本例中有 16 个线程)。因此,rabbit 中有多少个队列并不重要——如果只有一个连接,我会得到 16 个线程。如果我使用 DirectMessageListener
,这些相同的线程将被重用 - 当消息到达时,此处理程序方法 listen
在所有这 16 个线程中执行。因此,如果我在处理程序中做一些复杂的事情,rabbit-client
必须等待线程释放才能使用该线程获取下一条消息。另外,如果我将 setConsumersPerQueue
增加到 20,它会为每个队列创建 20 个消费者,但不会创建线程。在我的案例中,这 20*5 个消费者将全部重用 ThreadPoolExecutor
?
SimpleMessageListener
另一方面,会有自己的线程。如果并发消费者 == 1(我想我的情况是默认值)它只有一个线程。每当 secondUseCase*
队列中的任何一个有消息时,rabbit-client
java 库将使用它的 16 个线程之一,将消息转发到我在 SimpleMessageListener
。转发后,rabbit-client
java 库线程被释放,它可以返回从 rabbit 服务器获取更多消息。
你的理解是正确的。
主要区别在于,使用 DMLC,所有侦听器容器中的所有侦听器都在 amqp-client 中的共享线程池上调用(如果需要,您可以增加 16 个)。您需要确保池足够大以处理您预期的跨所有容器的并发,否则您将饿死。
因为线程是共享的,效率更高。
使用 SMLC,您不必担心这一点,但代价是每个并发都有一个线程。在那种情况下,amqp-client 中的一个小池通常就足够了。