相关疑难解决方法(0)

RabbitMQ和渠道Java线程安全

在本指南中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()));
Run Code Online (Sandbox Code Playgroud)

此时,您已经发现TestWrapperThread将该channel.basicAck(deliveryTag, false);调用作为最后一个操作.

通过我对文档的理解,这是不正确的并且可能有害,因为通道不是线程安全的,并且这种行为可能会搞砸了.但那我该怎么做呢?我的意思是,我有一些想法,但他们会把一切都变得更复杂,我想知道它是否真的有必要.

提前致谢

java multithreading rabbitmq

14
推荐指数
1
解决办法
3924
查看次数

标签 统计

java ×1

multithreading ×1

rabbitmq ×1