我试图查看DirectMessageListener
和SimpleMessageListener
之间的区别。我有这张图只是问它是否正确。
让我尝试描述我如何理解它,也许您告诉我它是否正确。spring-rabbit
前面是rabbit-client
Java库,该库连接到Rabbit-mq服务器并将消息传递到spring-rabbit库。该客户端具有一些ThreadPoolExecutor
(在这种情况下,我认为-16个线程)。因此,兔子中有多少个队列都没有关系-如果只有一个连接,我将获得16个线程。如果我使用DirectMessageListener
,这些相同的线程将被重用-当消息到达时,在所有这16个线程中都将执行此处理程序方法listen
。因此,如果我在处理程序中执行了一些复杂的操作,则rabbit-client
必须等待线程释放才能使用此线程获取下一条消息。另外,如果我将setConsumersPerQueue
增加到20,它将为每个队列创建20个使用者,而不是线程。在我的情况下,这20 * 5的使用者将全部重用ThreadPoolExecutor
提供的这16个线程?
另一方面,SimpleMessageListener
将具有其自己的线程。如果并发使用者== 1(我猜是默认情况),则它只有一个线程。每当secondUseCase*
队列中有消息时,在我的情况下,rabbit-client
java库将使用其16个线程之一,将消息转发到我在SimpleMessageListener
中具有的单个内部线程。一经转发,rabbit-client
java库线程便被释放,它可以返回以从Rabbit服务器获取更多消息。
最佳答案
您的理解是正确的。
主要区别在于,使用DMLC,所有侦听器容器中的所有侦听器都在amqp客户端的共享线程池上被调用(如果需要,可以增加16个)。您需要确保池足够大,以处理所有容器中的预期并发,否则您将饿死。
因为共享线程,所以效率更高。
使用SMLC,您不必担心这一点,但要以每个并发线程为代价。在这种情况下,amqp客户端中的一个小池通常就足够了。