【发布时间】:2015-08-22 02:33:40
【问题描述】:
在本指南中https://www.rabbitmq.com/api-guide.html RabbitMQ 伙计们表示:
通道和并发注意事项(线程安全)
通道实例不能在线程之间共享。应用程序应该更喜欢每个线程使用一个 Channel,而不是在多个线程之间共享同一个 Channel。虽然通道上的某些操作可以安全地并发调用,但有些则不能,并且会导致线路上的帧交错不正确。在线程之间共享频道也会干扰* Publisher Confirms。
线程安全非常重要,所以我尽可能地勤奋,但问题是:
我有这个从 Rabbit 接收消息的应用程序。收到消息后,它会对其进行处理,然后在完成后确认。应用程序只能在具有 2 个线程的固定线程池中同时处理 2 个项目。 Rabbit 的 QOS 预取设置为 2,因为我不想为应用提供超过它在一段时间内可以处理的内容。
现在,我的消费者的 handleDelivery 执行以下操作:
Task run = new Task(JSON.parse(message));
service.execute(new TestWrapperThread(getChannel(),run,envelope.getDeliveryTag()));
此时,您已经发现 TestWrapperThread 将 channel.basicAck(deliveryTag, false); 调用作为最后一个操作。
根据我对文档的理解,这是不正确的并且可能有害,因为通道不是线程安全的,并且这种行为可能会搞砸。但是我应该怎么做呢?我的意思是,我有一些想法,但它们会使一切变得更加复杂,我想弄清楚它是否真的有必要。
提前致谢
【问题讨论】:
-
如果我理解,你的问题是关于多线程 channel.basicAck(deliveryTag, false);对吗?
-
正确。这是我唯一的担心
标签: java multithreading rabbitmq