我试图查看DirectMessageListenerSimpleMessageListener之间的区别。我有这张图只是问它是否正确。

让我尝试描述我如何理解它,也许您告诉我它是否正确。

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服务器获取更多消息。

java - SimpleMessageListener与DirectMessageListener-LMLPHP

最佳答案

您的理解是正确的。

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

因为共享线程,所以效率更高。

使用SMLC,您不必担心这一点,但要以每个并发线程为代价。在这种情况下,amqp客户端中的一个小池通常就足够了。

10-06 13:21