我们正在使用RabbitMQ向应用上的用户发送通知。因此,有一个消费者会使用该应用程序向所有用户发送通知。
当队列中有多条消息时,我们希望rabbitmq至少间隔1小时发送每条消息。
因此,如果队列中有3条消息,则每条消息将相隔一小时发送。
如果队列中没有新消息并且发布了新消息,那么根据最后一条消息发送给消费者的时间,它将保留或发送消息。
有没有直接的方法呢?
答案 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);
}
注意事项
noAck: false
。 (在这里随意尝试)答案 2 :(得分:0)
经过大量的挖掘后,我找不到直接的方法。
实现此目的的一种方法是编写一个每60
分钟运行一次的cron作业(或者需要的间隔时间)。 cron作业将调用消费者来检查队列中是否有消息。如果有,它只接受一条消息,处理它然后关闭。
唯一的缺点是,如果第一条消息来自t0+1
,那么即使在处理消息之前等待60 minutes
之前没有消息进程也是如此。
如果可以改进,请告诉我。
答案 3 :(得分:0)
一种方法可能是: