如何读取RabbitMQ未确认消息/RabbitMQ循环

如何读取RabbitMQ未确认消息/RabbitMQ循环,rabbitmq,rabbitmqctl,Rabbitmq,Rabbitmqctl,我想读取RabbitMQ队列中未确认消息的有效负载或messageId。这可能吗 我之所以要这样做,是因为我试图使用RabbitMQ死信特性来构建一个周期,以便定期自动生成消息。 简单地说,创建两个队列—工作队列和延迟队列 将延迟队列中消息的TTL设置为需要定期发送的时间频率。针对不同的工作目的,可以使用不同的TTL发送不同的消息 将消息放入延迟队列。当消息过期时,它将重新发布到工作队列中。消息可以根据需要在工作队列中停留多长时间,直到消费者开始使用它为止 一个消费者拾取消息并进行处理。如果处理

我想读取RabbitMQ队列中未确认消息的有效负载或messageId。这可能吗

我之所以要这样做,是因为我试图使用RabbitMQ死信特性来构建一个周期,以便定期自动生成消息。 简单地说,创建两个队列—工作队列和延迟队列

  • 将延迟队列中消息的TTL设置为需要定期发送的时间频率。针对不同的工作目的,可以使用不同的TTL发送不同的消息
  • 将消息放入延迟队列。当消息过期时,它将重新发布到工作队列中。消息可以根据需要在工作队列中停留多长时间,直到消费者开始使用它为止
  • 一个消费者拾取消息并进行处理。如果处理成功,使用者需要确认工作队列,然后将消息写回延迟队列;如果处理失败(例如线程崩溃),则不会确认。然后消息将自动重新出现在工作队列中。然后,另一个消费者可以承担这项工作。当发送回延迟队列的消息再次过期时,它将被重新发布,然后被消费者重新消费。。。。。。一个构建的、工作负载分布的循环
  • 我希望确保循环中没有丢失或重复的消息,因为我不希望同时丢失作业或重复执行作业。然而,复制消息的可能性很小。下面显示使用者首先将消息写回延迟队列,并确认工作队列。如果线程正好在下面两行之间崩溃,则消息将位于延迟队列中,然后Rabbit将消息重新发布到工作队列中。循环结束时会出现重复的消息

      channel.basicPublish(DELAY_EXCHANGE, "", null, message.getBytes());
      channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
    
    为了防止出现上述情况,我想在上述两行之后添加一个看狗逻辑:

  • 检查循环中的消息总数(两个队列中的消息总数),以查看它是否等于我的预期数量(我预期数量小于10)

  • 如果数字不匹配,我想找出哪个丢失了,或者哪个重复了,然后处理它。我不关心这些消息的顺序,或者频率被干扰了,因为这是一个非常值得考虑的边缘情况。我可以很容易地检索那些已准备好的消息并重新查询它们。但问题是如何处理这些未确认的消息

  • 提前非常感谢


    Roy

    无法从其他上下文中读取未确认的消息原始消息已被消费并保留为未确认。

    非常感谢您的回答。我对我原来的问题作了更详细的说明。你能看一下吗?又来了!当问题看起来像一个全新的问题时,改变这么多并不是一个好主意。至于每消息TTL,请注意,不管是每消息TTL,它们都将从队列中移出(如果设置了DLX,则会显示死信)只有当他们到达队列头的时候。另外,当很难预测多个消费者和发布者的行为时,消息计数的想法可能不起作用。只需构建重复流。为了进一步讨论,我建议在上问这个问题(先搜索类似的问题)。@Zaq178我正试图在本地主机上使用RabbitMQ,但遇到了困难,你能给我一些关于这方面的建议吗