ActiveMQ 延迟消息

前言

有非常多的业务场景需要用到延迟消息功能。例如:订单待支付提醒,订单超时取消等。但并不是所有的消息中间件都支持延迟消息的功能,为了实现延迟消息,各路大神也是创造了很多的方案。
我们的系统使用的是ActiveMQ,ActiveMQ从版本5.4开始提供了持久化的延迟消息功能。下文就ActiveMQ提供的延迟消息功能进行介绍。

启用ActiveMQ定时消息功能

为了使用ActiveMQ的延迟消息功能,我们需要修改ActiveMQ的配置文件activemq.xml
在broker节点上添加schedulerSupport="true",如下所示:

1
2
<broker xmlns="http://activemq.apache.org/schema/core" schedulerSupport="true" >
</broker>

创建延迟消息并发送

1
2
3
4
5
6
7
8
jmsTemplate.send(orderCreatedTopic, session -> {
trueMapMessage orderCreatedMsg = session.createMapMessage();
trueorderCreatedMsg.setString("orderCode", orderCode);
true//延迟10分钟进行投递
truelong time = 10 * 60 * 1000;
trueorderCreatedMsg.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);
truereturn orderCreatedMsg;
});

延时消息属性总结

ActiveM提供了很多高级的延时消息配置属性,解释如下:

属性 类型 描述
 AMQ_SCHEDULED_DELAY long broker在投递该消息前等待的毫秒数
 AMQ_SCHEDULED_PERIOD long 每次重新投递该消息的时间间隔
 AMQ_SCHEDULED_REPEAT int 重复投递该消息的次数
 AMQ_SCHEDULED_CRON  String 使用一个cron表达式来表示消息投递的策略

例子:

1
2
3
4
5
6
7
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);

参考资料

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

文章目录
  1. 1. 前言
  2. 2. 启用ActiveMQ定时消息功能
  3. 3. 创建延迟消息并发送
  4. 4. 延时消息属性总结
  5. 5. 参考资料
|