我有一个基本的设置,消费者正在监听项目的"/queue/work"。消费者一次只能消费一件物品。
为此,我会同时接收任何其他项目,并在处理项目时取消订阅队列。
如果我现在再次订阅到同一个队列,NACKed 消息不会重新传递到客户端 - 除非我删除整个连接并重新连接会话 - 这不是我想要做的,因为它也会影响其他订阅:(
有没有另一种方法可以实现这种"拿一个项目 - 忙碌时忽略"模式?
根据 STOMP 协议规范,服务器不会将 NACK 消息重新传递给发送 NACK 的客户端。
重新订阅时,请尝试使用任何其他订阅者未使用的其他 id
标头值。
回答我自己的问题 - 实现它而不必对产生重新传递问题的消息进行 NACK 的方法是使用事务和预取设置的组合:
如果在 STOMP 标头中设置"预取计数":1 - 服务器在发送下一条消息之前只允许在通道上"传输中"一条消息。这意味着客户端必须在发送新消息之前确认/NACK消息。
因此,我们不是仅在"作业"完成时才发送 ACK - 而是在收到消息时启动事务 - 立即确认消息 - 并在作业完成时提交事务。这样,"失败"的作业就可以正确重新交付。