Java SimpleMessageListener与DirectMessageListener
我试图了解Java SimpleMessageListener与DirectMessageListener,java,spring,rabbitmq,spring-rabbit,Java,Spring,Rabbitmq,Spring Rabbit,我试图了解DirectMessageListener和SimpleMessageListener之间的区别。我有这幅画只是想问问它是否正确 让我试着描述一下我是如何理解它的,也许你能告诉我它是否正确 在springrabbit前面有rabbit客户端java库,它连接到rabbitmq服务器,并将消息传递到springrabbit库。这个客户端有一些ThreadPoolExecutor(在本例中,它有-16个线程)。所以,无论rabbit中有多少队列,只要有一个连接,我就有16个线程。如果我使用
DirectMessageListener
和SimpleMessageListener
之间的区别。我有这幅画只是想问问它是否正确
让我试着描述一下我是如何理解它的,也许你能告诉我它是否正确
在springrabbit
前面有rabbit客户端
java库,它连接到rabbitmq服务器,并将消息传递到springrabbit库。这个客户端有一些ThreadPoolExecutor
(在本例中,它有-16个线程)。所以,无论rabbit中有多少队列,只要有一个连接,我就有16个线程。如果我使用DirectMessageListener
,这些线程将被重用,并且当消息到达时,此处理程序方法listen
将在所有这16个线程中执行。所以,若我在处理程序中执行一些复杂的操作,rabbit客户机
必须等待线程释放,以便使用该线程获取下一条消息。另外,如果我将setConsumersPerQueue
增加到20,它将为每个队列创建20个消费者,但不会创建线程。在我的例子中,这20*5个使用者都将重用ThreadPoolExecutor
提供的这16个线程
另一方面,SimpleMessageListener将拥有自己的线程。如果concurrent consumers==1(我猜默认情况与我的情况相同),那么它只有一个线程。每当在任何secondUseCase*
队列上有消息时,rabbit客户端
java库将使用其16个线程中的一个,将消息转发到SimpleMessageListener
中的单个内部线程。一旦它被转发,rabbit客户端
java库线程就被释放,它可以从rabbit服务器返回获取更多消息
你的理解是正确的 主要区别在于,对于DMLC,所有侦听器容器中的所有侦听器都在amqp客户机的共享线程池上调用(如果需要,可以增加16)。您需要确保池足够大,可以跨所有容器处理预期的并发性,否则您将面临饥饿 因为线程是共享的,所以效率更高
使用SMLC,您不必担心这一点,但代价是每个并发都有一个线程。在这种情况下,amqp客户端中的一个小池通常就足够了。可能的dup@它不包含该帖子的所有信息。谢谢确认。