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

时间:2014-11-11 05:03:16

标签: rabbitmq rabbitmqctl

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

我想这样做的原因是我试图使用RabbitMQ死信功能来构建一个周期来定期自动生成消息。 简而言之,创建两个队列 - 工作队列和延迟队列。

  1. 将延迟队列中的消息的TTL设置为需要定期的时间频率。可以针对不同的工作目的使用不同的TTL进行不同的消息;
  2. 将消息放入延迟队列。当消息过期时,它将重新发布到工作队列中。消息可以根据需要位于工作队列中,直到消费者使用它为止。
  3. 一个消费者接收消息并进行处理。如果处理成功,则消费者需要确认工作队列,然后将消息写回延迟队列;如果处理失败(例如,线程崩溃),则不进行确认。然后,消息将自动重新出现在工作队列中。然后另一个消费者可以接受这项工作。当发送回延迟队列的消息再次过期时,它将被重新发布,然后由消费者重新使用......构建一个循环,分配工作负载。
  4. 我想确保周期中没有丢失或重复的消息,因为我不想丢失工作或同时双重完成工作。但是,可能会发生微小的重复消息。下面显示消费者首先将消息写回延迟队列,并确认工作队列。如果线程在两行以下之间崩溃,则消息将在延迟队列中,并且Rabbit将该消息再次重新发布到工作队列中。最终会在循环中出现重复的消息。

      channel.basicPublish(DELAY_EXCHANGE, "", null, message.getBytes());
      channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
    

    为了防止上述情况,我想在上面两行之后添加一个狗监视逻辑:

    1. 检查周期中的消息总数(两个队列中的消息总数),看它是否等于我的预期数量(我预计数字减去10);

    2. 如果数字不匹配,我想找出哪一个丢失或哪一个重复,然后处理它。我不关心这些消息的顺序,或者频率受到干扰,因为这是一个非常值得考虑的边缘情况。我可以轻松地检索那些准备好并重新排队的消息。但问题是如何处理那些未经确认的消息?

    3. 非常感谢你!

      罗伊

1 个答案:

答案 0 :(得分:2)

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