在RabbitMQ中,是否有一种定期向使用者发送消息的方法?

在RabbitMQ中,是否有一种定期向使用者发送消息的方法?,rabbitmq,Rabbitmq,我们正在使用RabbitMQ向应用程序上的用户发送通知。因此,有一个消费者将向使用该应用程序的所有用户发送通知 当队列中有多条消息时,我们希望rabbitmq至少间隔1小时发送每条消息 因此,如果队列中有3条消息,每条消息将间隔一小时发送 如果队列中没有新消息且发布了新消息,则根据上次消息发送给消费者的时间,它将保留或发送消息 有什么直接的方法吗?是的,有,已经描述过了。我只引用一部分: 要延迟消息,用户必须使用特殊的 称为x-delay的标头,它接受一个表示数字的整数 RabbitMQ应延迟消

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

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

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

如果队列中没有新消息且发布了新消息,则根据上次消息发送给消费者的时间,它将保留或发送消息


有什么直接的方法吗?

是的,有,已经描述过了。我只引用一部分:

要延迟消息,用户必须使用特殊的 称为x-delay的标头,它接受一个表示数字的整数 RabbitMQ应延迟消息的毫秒数


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

是的,有,如所述。我只引用一部分:

要延迟消息,用户必须使用特殊的 称为x-delay的标头,它接受一个表示数字的整数 RabbitMQ应延迟消息的毫秒数


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

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

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

唯一的缺点是,如果第一条消息出现在
t0+1
处,则即使在处理消息之前没有消息处理,它也会在处理消息之前等待
60分钟


如果可以改进,请告诉我

经过大量的挖掘,我找不到一个直接的方法来做这件事

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

唯一的缺点是,如果第一条消息出现在
t0+1
处,则即使在处理消息之前没有消息处理,它也会在处理消息之前等待
60分钟

如果可以改进,请告诉我

一种方法可以是:

  • 每5分钟或“x”分钟安排一次cron
  • Cron检查队列中是否有消息,它从队列中提取一条消息。如果通知发送成功,您可以将cron的计划更改为60分钟后的下一次运行(以及运行后的5或x分钟)。有关重新安排窗口计划任务的详细信息,请查看链接
  • 如果队列中没有消息,Cron将不执行任何操作
  • 一种方法可以是:

  • 每5分钟或“x”分钟安排一次cron
  • Cron检查队列中是否有消息,它从队列中提取一条消息。如果通知发送成功,您可以将cron的计划更改为60分钟后的下一次运行(以及运行后的5或x分钟)。有关重新安排窗口计划任务的详细信息,请查看链接
  • 如果队列中没有消息,Cron将不执行任何操作

  • 我无意中发现了您的问题,希望以10秒的间隔进行相同的操作,但在使用channel.consume()方法时无法做到这一点

    我开始阅读文档,了解到在使用预回迁时,队列将等待消息确认或nacked后再发送另一条消息

    因此,作为黑客,我给我的ack/nack功能超时10秒,虽然我的处理完成了,但我的消费者没有收到更多的消息,因为最后一条消息仍在等待确认

    检查文档

    我的示例代码

     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
      。(请随意在此处进行试验)

    我无意中发现了您的问题,希望以10秒的间隔进行相同的操作,但在使用channel.consume()方法时无法做到这一点

    我开始阅读文档,了解到在使用预回迁时,队列将等待消息确认或nacked后再发送另一条消息

    因此,作为黑客,我给我的ack/nack功能超时10秒,虽然我的处理完成了,但我的消费者没有收到更多的消息,因为最后一条消息仍在等待确认

    检查文档

    我的示例代码

     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
      。(请随意在此处进行试验)

    我认为这行不通。x-delay标志将对消息起作用。假设我在
    t0
    发布一条消息,延迟
    60分钟
    ,那么消息将在60分钟后发送到队列。现在,如果我以相同的延迟发布3条MSG,那么所有这些消息将在60分钟后发送。我想要的是第一条消息在时间
    t0
    发送,第二条在时间
    t0+60
    发送,第三条在时间
    t0+120
    发送。如果我误解了你的回答,请纠正我也许:)也许我误解了你的评论。但是