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

Rejected STOMP message not redelivered to client over RabbitMQ

我有一个基本设置,消费者正在收听“/queue/work”的商品。消费者一次只能消费一件商品。

为了做到这一点,我拒绝确认同时收到的任何其他项目,并在处理该项目时从队列中取消订阅。

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

还有其他方法可以实现这个 "take one item - ignore while busy" 模式吗?

根据 STOMP Protocol Spec,服务器不会 re-deliver 向发送 NACK 的客户端发送 NACKed 消息。

当您 re-subscribe 时,请尝试使用其他任何订阅者未使用的其他 id header 值。

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

如果在 STOMP 中设置 "prefetch-count": 1 header - 服务器将只允许频道上的一条消息 "in flight" 发送下一条消息。这意味着在发送新消息之前,客户端必须 ACK/NACK 消息。

因此,我们不会仅在 "job" 完成时才发送 ACK - 我们会在收到消息时启动事务 - 立即确认消息 - 并在作业完成后提交事务。这样 "failed" 个作业可以正确重新传送。