RabbitMQ 和通道 Java 线程安全
在本指南 https://www.rabbitmq.com/api-guide.html RabbitMQ guys 指出:
通道和并发注意事项(线程安全)
通道实例不得在线程之间共享。应用程序应优先使用每个线程的通道,而不是在多个线程之间共享相同的通道。虽然通道上的某些操作可以安全地并发调用,但有些操作则不然,并且会导致网络上的帧交错不正确。线程之间的共享通道也会干扰 * 发布者确认。
线程安全非常重要,所以我试图尽可能地勤奋,但问题是:
我有这个应用程序,从兔子接收消息。收到消息后,它会处理该消息,然后在完成后进行 ack。应用程序可以在具有 2 个线程的固定线程池中同时处理 2 个项目。Rabbit 的 QOS 预取设置为 2,因为我不想为应用提供超出其在一段时间内处理能力的量。
现在,我的使用者的句柄交付执行以下操作:
Task run = new Task(JSON.parse(message));
service.execute(new TestWrapperThread(getChannel(),run,envelope.getDeliveryTag()));
此时,您已经知道 TestWrapperThread 将调用作为最后一个操作执行。channel.basicAck(deliveryTag, false);
根据我对文档的理解,这是不正确的,并且可能有害,因为通道不是线程安全的,这种行为可能会搞砸事情。但是我该怎么做呢?我的意思是,我有一些想法,但它们会使一切变得更加复杂,我想弄清楚它是否真的有必要。
提前致谢