我有一个基本设置,消费者正在收听" / queue / work"对于项目。消费者意味着一次只消费一件物品。
这样做我同时收到任何其他项目,并在项目处理时从队列中取消UNSUBSCRIBE。
如果我现在再次订阅同一个队列,则不会将NACKed消息重新传送到客户端 - 除非我删除整个连接并重新连接会话 - 这不是我想要做的事情,因为它也会影响其他订阅: (
是否有另一种方法来实现这一点"采取一个项目 - 在忙碌时忽略"模式?
答案 0 :(得分:0)
根据STOMP Protocol Spec,服务器不会将NACKed消息重新发送给发送NACK的客户端。
重新订阅时,请尝试使用其他订阅者未使用的其他id
标头值。
答案 1 :(得分:0)
要回答我自己的问题 - 实现它的方法,而不必NACK产生重新传递问题的消息是使用事务和预取设置的组合:
如果在STOMP标题中设置" prefetch-count":1 - 服务器将只允许一条消息"在飞行中"在发送下一个之前在频道上。这意味着客户端必须在发送新消息之前对消息进行ACK / NACK。
因此,只有在"作业"而不是发送ACK。已完成 - 我们在收到消息时立即启动事务 - 立即确认消息 - 并在作业完成时执行事务。这种方式"失败"工作正确地重新交付。