有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java SimpleMessageListener与DirectMessageListener

我想看看DirectMessageListenerSimpleMessageListener之间的区别。我有这幅画只是想问问它是否正确

让我试着描述一下我是如何理解它的,也许你能告诉我它是否正确

spring-rabbit前面有rabbit-clientjava库,它连接到rabbit mq服务器并将消息传递到spring rabbit库。这个客户机有一些ThreadPoolExecutor(在本例中,我认为它有-16个线程)。所以,无论rabbit中有多少队列,只要有一个连接,我就有16个线程。如果我使用DirectMessageListener,这些相同的线程将被重用,并且当消息到达时,此处理程序方法listen将在所有这16个线程中执行。所以,若我在处理程序中执行一些复杂的操作,rabbit-client必须等待线程释放,以便使用该线程获取下一条消息。另外,如果我将setConsumersPerQueue增加到20,它将为每个队列创建20个使用者,但不会创建线程。在我的例子中,这20*5个使用者都将重用ThreadPoolExecutor提供的这16个线程

另一方面SimpleMessageListener将有自己的线程。如果concurrent consumers==1(我猜默认情况与我的情况相同),那么它只有一个线程。每当在任何secondUseCase*队列上有消息时,rabbit-clientjava库将使用其16个线程中的一个线程(在我的例子中)将消息转发到SimpleMessageListener中的单个内部线程。一旦它被转发,rabbit-clientjava库线程就被释放,它可以从rabbit服务器返回获取更多消息

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    你的理解是正确的

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

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

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