Java客户端中的RabbitMQ通道和线程
我想快速确认我怀疑RabbitMQ文档的这部分内容: 对使用者的回调在与连接管理的线程分离的线程上进行调度。这意味着使用者可以安全地调用连接或通道上的阻塞方法,如queueDeclare、txCommit、basicCancel或basicPublish 每个通道都有自己的调度线程。对于每个通道一个消费者的最常见用例,这意味着消费者不会阻碍其他消费者。如果每个通道有多个使用者,请注意,长时间运行的使用者可能会阻止向该通道上的其他使用者发送回调 我有各种命令(消息)通过单个入站队列和通道传入,该队列和通道连接了一个DefaultConsumer。假设DefaultConsumer中有一个线程池,允许我直接从consumer回调方法运行应用程序逻辑,并且我没有阻止后续命令的处理,这是否正确?如果出现瓶颈,我可以给RMQ一个更大的线程池Java客户端中的RabbitMQ通道和线程,java,multithreading,rabbitmq,Java,Multithreading,Rabbitmq,我想快速确认我怀疑RabbitMQ文档的这部分内容: 对使用者的回调在与连接管理的线程分离的线程上进行调度。这意味着使用者可以安全地调用连接或通道上的阻塞方法,如queueDeclare、txCommit、basicCancel或basicPublish 每个通道都有自己的调度线程。对于每个通道一个消费者的最常见用例,这意味着消费者不会阻碍其他消费者。如果每个通道有多个使用者,请注意,长时间运行的使用者可能会阻止向该通道上的其他使用者发送回调 我有各种命令(消息)通过单个入站队列和通道传入,该队
此外,偶尔会有一个basicPublish从其他线程发布到同一通道。我认为这确实阻碍了消费者?我想我应该使用一个新的通道来执行此操作。您提到的线程池不是
DefaultConsumer
的一部分,而是连接的一部分,它在通道和DefaultConsumer
之间共享。它允许并行调用不同的使用者。看
所以,通过增加线程池的大小,可以达到更高的并行级别。然而,这并不是影响它的唯一因素
这里有一个很大的警告:不管线程池中有多少线程,流经单个通道的传入消息都会被串行处理。这就是ConsumerWorkService
的实现方式
因此,为了能够同时使用传入消息,您必须管理多个通道,或者将这些消息放入单独的线程池
发布不使用连接
的线程池中的线程,因此它们不会占用使用者
有关更多详细信息,您可以查看。从@wheleph到上述帖子的链接已过时,新链接是我想知道如果我不需要自动确认,而是在单独的线程池中使用,该怎么办?