我认为这是RabbitMQ的常见用例: 工作队列 - 服务器从用户获取请求并将它们存储在队列中以便稍后处理。问题是某些任务可能需要一分钟,所以我决定不自动确认:
GetResponse response = channel.basicGet(queueName, false);
我想在工作完成时确认
channel.basicAck(deliveryTag, false);
据我所知: https://www.rabbitmq.com/confirms.html("在同一频道上发送basic.ack" - 应在收到该消息的同一频道上进行确认。)
所以我决定要有一个到频道的消息地图(在我的用例中,每个消息都有一个频道)。每次消息的工作完成,我都会知道。
我认为这种设计存在很大缺陷。它迫使我在我的服务器中保存一个状态,并迫使我为每条消息设置一个频道,而不是重用频道。
我确定这是一个广泛使用的案例 - 会是什么: 1.我应该推迟使用线程本地频道吗?如果是这样,是否可以在另一个线程上确认消息? 2.有没有比保存此消息更好的方法来处理acking消息 - >频道地图?
谢谢
答案 0 :(得分:1)
我对java不太熟悉,但据我所知,每个线程有一个通道是正确的。我不认为频道是线程安全的。
此外,存储频道ID(或名称或其他任何内容)并在同一频道上收听消息是必要的
我个人认为您所提供的内容的高级概述没有任何问题。
但是,你是对的,每个消息的频道是""是个坏主意。它应该是每个线程的通道,并且您可以在同一个通道上和同一个线程中使用多个消息。只需确保在消费它的频道上收听消息