Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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客户端中的RabbitMQ通道和线程_Java_Multithreading_Rabbitmq - Fatal编程技术网

Java客户端中的RabbitMQ通道和线程

Java客户端中的RabbitMQ通道和线程,java,multithreading,rabbitmq,Java,Multithreading,Rabbitmq,我想快速确认我怀疑RabbitMQ文档的这部分内容: 对使用者的回调在与连接管理的线程分离的线程上进行调度。这意味着使用者可以安全地调用连接或通道上的阻塞方法,如queueDeclare、txCommit、basicCancel或basicPublish 每个通道都有自己的调度线程。对于每个通道一个消费者的最常见用例,这意味着消费者不会阻碍其他消费者。如果每个通道有多个使用者,请注意,长时间运行的使用者可能会阻止向该通道上的其他使用者发送回调 我有各种命令(消息)通过单个入站队列和通道传入,该队

我想快速确认我怀疑RabbitMQ文档的这部分内容:

对使用者的回调在与连接管理的线程分离的线程上进行调度。这意味着使用者可以安全地调用连接或通道上的阻塞方法,如queueDeclare、txCommit、basicCancel或basicPublish

每个通道都有自己的调度线程。对于每个通道一个消费者的最常见用例,这意味着消费者不会阻碍其他消费者。如果每个通道有多个使用者,请注意,长时间运行的使用者可能会阻止向该通道上的其他使用者发送回调

我有各种命令(消息)通过单个入站队列和通道传入,该队列和通道连接了一个DefaultConsumer。假设DefaultConsumer中有一个线程池,允许我直接从consumer回调方法运行应用程序逻辑,并且我没有阻止后续命令的处理,这是否正确?如果出现瓶颈,我可以给RMQ一个更大的线程池


此外,偶尔会有一个basicPublish从其他线程发布到同一通道。我认为这确实阻碍了消费者?我想我应该使用一个新的通道来执行此操作。

您提到的线程池不是
DefaultConsumer
的一部分,而是
连接的一部分,它在
通道和
DefaultConsumer
之间共享。它允许并行调用不同的使用者。看

所以,通过增加线程池的大小,可以达到更高的并行级别。然而,这并不是影响它的唯一因素

这里有一个很大的警告:不管线程池中有多少线程,流经单个通道的传入消息都会被串行处理。这就是
ConsumerWorkService
的实现方式

因此,为了能够同时使用传入消息,您必须管理多个通道,或者将这些消息放入单独的线程池

发布不使用
连接
的线程池中的线程,因此它们不会占用使用者


有关更多详细信息,您可以查看。

从@wheleph到上述帖子的链接已过时,新链接是我想知道如果我不需要自动确认,而是在单独的线程池中使用,该怎么办?