Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SimpleMessageListener与DirectMessageListener_Java_Spring_Rabbitmq_Spring Rabbit - Fatal编程技术网

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@它不包含该帖子的所有信息。谢谢确认。