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