Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 与ExecutorService同时使用消息_Java_Multithreading_Rabbitmq - Fatal编程技术网

Java 与ExecutorService同时使用消息

Java 与ExecutorService同时使用消息,java,multithreading,rabbitmq,Java,Multithreading,Rabbitmq,我试图在Java中使用RabbitMQ运行一个非常基本的应用程序。我只想使用JavaExecutorService并发使用消息。我的项目使用Spring,所以我定义了我的ThreadPoolExecutorFactoryBean如下: <bean class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean" destroy-method="destroy"> &l

我试图在Java中使用RabbitMQ运行一个非常基本的应用程序。我只想使用Java
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