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

拒绝的STOMP消息未通过RabbitMQ重新传递到客户端,rabbitmq,stomp,spring-websocket,sockjs,spring-messaging,Rabbitmq,Stomp,Spring Websocket,Sockjs,Spring Messaging,我有一个基本设置,其中消费者正在收听项目的“/队列/工作”。消费者一次只能消费一种商品 要做到这一点,我将同时接收任何其他项目,并在处理项目时从队列中取消订阅 如果我现在再次订阅同一队列,则NACKed消息不会重新发送到客户端-除非我断开整个连接并重新连接会话-这不是我想要做的,因为它也会影响其他订阅:( 是否有另一种方法来实现这种“take one item-忙碌时忽略”模式?根据,服务器不会将NACK消息重新传递给发送NACK的客户端 重新订阅时,请尝试使用其他订阅方未使用的不同的id标题值

我有一个基本设置,其中消费者正在收听项目的“/队列/工作”。消费者一次只能消费一种商品

要做到这一点,我将同时接收任何其他项目,并在处理项目时从队列中取消订阅

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

是否有另一种方法来实现这种“take one item-忙碌时忽略”模式?

根据,服务器不会将NACK消息重新传递给发送NACK的客户端


重新订阅时,请尝试使用其他订阅方未使用的不同的
id
标题值。

回答我自己的问题-实现此功能而不必询问产生重新交付问题的消息的方法是使用事务和预取设置的组合:

如果在STOMP报头中设置“预回迁计数”:1,则在发送下一条消息之前,服务器将只允许通道上的一条消息处于“飞行中”。这意味着客户端必须在发送新消息之前确认/确认消息

因此,我们不是只在“作业”完成时才发送ACK,而是在收到消息时启动事务,即立即确认消息,并在作业完成时提交事务,这样“失败”的作业才能正确地重新交付