拒绝的 STOMP 消息未通过 RabbitMQ 重新传递到客户端



我有一个基本的设置,消费者正在监听项目的"/queue/work"。消费者一次只能消费一件物品。

为此,我会同时接收任何其他项目,并在处理项目时取消订阅队列。

如果我现在再次订阅到同一个队列,NACKed 消息不会重新传递到客户端 - 除非我删除整个连接并重新连接会话 - 这不是我想要做的,因为它也会影响其他订阅:(

有没有另一种方法可以实现这种"拿一个项目 - 忙碌时忽略"模式?

根据 STOMP 协议规范,服务器不会将 NACK 消息重新传递给发送 NACK 的客户端。

重新订阅时,请尝试使用任何其他订阅者未使用的其他 id 标头值。

回答我自己的问题 - 实现它而不必对产生重新传递问题的消息进行 NACK 的方法是使用事务和预取设置的组合:

如果在 STOMP 标头中设置"预取计数":1 - 服务器在发送下一条消息之前只允许在通道上"传输中"一条消息。这意味着客户端必须在发送新消息之前确认/NACK消息。

因此,我们不是仅在"作业"完成时才发送 ACK - 而是在收到消息时启动事务 - 立即确认消息 - 并在作业完成时提交事务。这样,"失败"的作业就可以正确重新交付。

最新更新