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

时间:2017-06-15 12:13:46

标签: rabbitmq stomp spring-websocket sockjs spring-messaging

我有一个基本设置,消费者正在收听" / queue / work"对于项目。消费者意味着一次只消费一件物品。

这样做我同时收到任何其他项目,并在项目处理时从队列中取消UNSUBSCRIBE。

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

是否有另一种方法来实现这一点"采取一个项目 - 在忙碌时忽略"模式?

2 个答案:

答案 0 :(得分:0)

根据STOMP Protocol Spec,服务器不会将NACKed消息重新发送给发送NACK的客户端。

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

答案 1 :(得分:0)

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

如果在STOMP标题中设置" prefetch-count":1 - 服务器将只允许一条消息"在飞行中"在发送下一个之前在频道上。这意味着客户端必须在发送新消息之前对消息进行ACK / NACK。

因此,只有在"作业"而不是发送ACK。已完成 - 我们在收到消息时立即启动事务 - 立即确认消息 - 并在作业完成时执行事务。这种方式"失败"工作正确地重新交付。