在RabbitMQ中有一种定期向消费者发送消息的方法吗?

时间:2017-02-12 06:36:31

标签: rabbitmq

我们正在使用RabbitMQ向应用上的用户发送通知。因此,有一个消费者会使用该应用程序向所有用户发送通知。

当队列中有多条消息时,我们希望rabbitmq至少间隔1小时发送每条消息。

因此,如果队列中有3条消息,则每条消息将相隔一小时发送。

如果队列中没有新消息并且发布了新消息,那么根据最后一条消息发送给消费者的时间,它将保留或发送消息。

有没有直接的方法呢?

4 个答案:

答案 0 :(得分:1)

是的,有,here。我只想引用一部分:

  

要延迟消息,用户必须使用特殊消息发布消息   标题称为x-delay,它采用表示数字的整数   RabbitMQ应该延迟消息的毫秒数。

另一种方法(在rabbitmq添加延迟交换之前)使用了死信交换和消息ttl的组合,例如here所述。

答案 1 :(得分:1)

我偶然发现了您的问题,想以10秒的间隔进行相同操作,但是在使用channel.consume()方法时却无法做到。

我开始阅读文档,并知道在使用预取时,队列将等到消息被确认或被确认后再发送。

因此,作为黑客,我将确认/否定功能超时了10秒钟,尽管我的处理已完成,但由于最后一个仍在等待确认,我的使用者没有收到更多消息。

查看文档here

我的示例代码

 if (response) {
        setTimeout(() => {
          console.log("acking now ");
          pendingImportChannel.ack(pendingImportMessage);
        }, 10000);
        console.log("Pending import message acknowledged.");
      } else {
        console.log("Rejecting message => " + JSON.stringify(pendingImportDetails));
        setTimeout(() => {
          pendingImportChannel.nack(pendingImportMessage, false, true);
        }, 10000);
      }

注意事项

  • 您的预取值应为1(或您希望在一次呼叫中接收的消息数)
  • 确保您没有独立确认/拒绝。
  • 保持您的确认策略为noAck: false。 (在这里随意尝试)

答案 2 :(得分:0)

经过大量的挖掘后,我找不到直接的方法。

实现此目的的一种方法是编写一个每60分钟运行一次的cron作业(或者需要的间隔时间)。 cron作业将调用消费者来检查队列中是否有消息。如果有,它只接受一条消息,处理它然后关闭。

唯一的缺点是,如果第一条消息来自t0+1,那么即使在处理消息之前等待60 minutes之前没有消息进程也是如此。

如果可以改进,请告诉我。

答案 3 :(得分:0)

一种方法可能是:

  1. 为每5个或" x"安排cron分钟。
  2. Cron检查队列中是否有消息,它从队列中提取一个消息。如果成功发送通知,您可以在60分钟后(以及运行后5或x分钟后)将cron的计划更改为下一次运行。有关重新安排窗口计划任务的详细信息,请查看this链接。
  3. 如果队列中没有消息,Cron什么都不做。