延迟和定时消息投递(Delay and Schedule Message Delivery)-翻译

原文地址

http://activemq.apache.org/delay-and-schedule-message-delivery

ActiveMQ从5.4版本开始支持一个可选择的持久化调度器(scheduler)在ActiveMQ的消息broker中。在XML Configuration中通过设置broker的schedulerSupport属性为true来开启此功能。一个ActiveMQ客户端能够利用延迟推送通过下面的消息属性:

检查你的消息属性

消息属性scheduledJobId被保留给工作调度(Job Scheduler)使用。如果在发送前设置了此属性,这个消息将被立即发送,而不是定时发送。另外,定时消息被接收之后,scheduledJobId属性将被设置在被接收的消息上,因此请记住如果使用像Camel Route 之类的东西,当重新发送该消息的时候可能会自动复制属性

属性名称类型描述
AMQ_SCHEDULED_DELAYlong在broker将消息投递之前,消息等待的时长(单位为毫秒)
AMQ_SCHEDULED_PERIODlong在重新调度消息之前,消息的等待时长(单位为毫秒)
AMQ_SCHEDULED_REPEATint重复调度消息的投递次数
AMQ_SCHEDULED_CRONString可以使用Cron表达式设置调度

为了方便Java Jms客户端-接口***org.apache.activemq.ScheduledMessage***上有用于调度的属性名称

例如,有一个消息被延迟60s调度–你需要设置AMQ_SCHEDULED_DELAY 属性

MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
long time = 60 * 1000;
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);
producer.send(message);

你可以设置消息等待设置一个初始延迟,和重复投递十次,每次重新投递之前等待10秒钟

MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
long delay = 30 * 1000;
long period = 10 * 1000;
int repeat = 9;
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
producer.send(message);

你可以使用CRON表达式去设置调度消息,例如,你想将一个消息每隔一个小时投递一次,你需要将CRON条目设置为- 0 * * * * 例如:

MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");
producer.send(message);

CRON调度优先于使用消息延迟-然而如果CRON条目设置重复次数和周期,则ActiveMQ调度器将在每次CRON条目触发时安排投递消息。用一个例子更容易解释,假设你想让一个消息投递10次,伴随着每条消息之前有1秒的延迟,并且你想每小时发生一次-你可以这样做

MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 1000);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 1000);
message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 9);
producer.send(message);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值