Java 与ExecutorService同时使用消息
我试图在Java中使用RabbitMQ运行一个非常基本的应用程序。我只想使用JavaJava 与ExecutorService同时使用消息,java,multithreading,rabbitmq,Java,Multithreading,Rabbitmq,我试图在Java中使用RabbitMQ运行一个非常基本的应用程序。我只想使用JavaExecutorService并发使用消息。我的项目使用Spring,所以我定义了我的ThreadPoolExecutorFactoryBean如下: <bean class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean" destroy-method="destroy"> &l
ExecutorService
并发使用消息。我的项目使用Spring,所以我定义了我的ThreadPoolExecutorFactoryBean
如下:
<bean class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean"
destroy-method="destroy">
<property name="corePoolSize" value="8"/>
<property name="keepAliveSeconds" value="600"/>
<property name="maxPoolSize" value="16"/>
<property name="threadGroupName" value="CallbackQueue-Group"/>
<property name="threadNamePrefix" value="CallbackQueue-Worker-"/>
</bean>
简单地说,当我将多条消息发布到队列中时,我应该看到日志语句非常接近,即使任务需要一段时间才能执行。然而,我发现我的消费者一次只处理一个任务,尽管有ExecutorService
!更奇怪的是,我实际上看到池服务队列中有不同的线程,尽管从未同时出现:
12:43:40.650 [CallbackQueue-Worker-2] DEBUG MyApplication - Received message 65bfbba29b4965eb0674c082c73dad7c
12:43:43.737 [CallbackQueue-Worker-3] DEBUG MyApplication - Received message 2a0b29012b13857c5a0ae8060f66dbaa
12:43:46.755 [CallbackQueue-Worker-3] DEBUG MyApplication - Received message 3c0742f9a284ac9c6b602200254c70db
12:43:49.769 [CallbackQueue-Worker-3] DEBUG MyApplication - Received message a462236fab19d51ba4bfea1582410a64
12:43:52.783 [CallbackQueue-Worker-3] DEBUG MyApplication - Received message 1a4713e1066dfc9e4ec1302098450a1f
我做错了什么?我的
ThreadPoolExecutoryFactoryBean
或我的RabbitMQ代码中是否有我遗漏的其他配置?来自com.RabbitMQ.client.Channel的描述:
虽然一个通道可以由多个线程使用,但重要的是
确保一次只有一个线程执行一个命令。同时发生的
执行命令可能会导致出现意外的帧错误
扔
这可能是一个原因吗?您的日志显示使用了不同的worker(我们看到2和3),但一次只使用一个worker。不,这不应该是问题。整个消费点是,它可以同时使用多个线程来完成,以便能够使作业处理并发。否则,为什么在创建
连接时,我可以在新建连接
工厂方法中将ExecutorService
传递给它?但是您可能需要另外打开两个或多个通道?每个通道可以一次服务多个连接,不是吗?这被标记为答案,但并不能真正提供解决方案@NaftuliTzviKay,这个答案对你有什么帮助?实例化更多的Channel
s。如果你想要8个线程,创建8个频道,每个频道有一个线程服务。我知道你大约两年前问过这个问题。希望你还记得。我必须实现类似的场景,我需要一个工作线程池(ExecutorService)来使用来自Rabbit队列的消息。这方面成功了吗?你能找到解决办法吗?我现在也遇到了同样的问题。
12:43:40.650 [CallbackQueue-Worker-2] DEBUG MyApplication - Received message 65bfbba29b4965eb0674c082c73dad7c
12:43:43.737 [CallbackQueue-Worker-3] DEBUG MyApplication - Received message 2a0b29012b13857c5a0ae8060f66dbaa
12:43:46.755 [CallbackQueue-Worker-3] DEBUG MyApplication - Received message 3c0742f9a284ac9c6b602200254c70db
12:43:49.769 [CallbackQueue-Worker-3] DEBUG MyApplication - Received message a462236fab19d51ba4bfea1582410a64
12:43:52.783 [CallbackQueue-Worker-3] DEBUG MyApplication - Received message 1a4713e1066dfc9e4ec1302098450a1f