ActiveMQ还支持消息的延迟投递和定时投递,这也是针对于消息生产者的。ActiveMQ为我们提供的 ScheduledMessage 类描述了延迟投递和定时投递的四种属性:
属性名 | 数据类型 | 描述 |
---|---|---|
AMQ_SCHEDULED_DELAY | long | 延迟投递的时间,单位为毫秒 |
AMQ_SCHEDULED_PERIOD | long | 重复投递的时间间隔,单位为毫秒 |
AMQ_SCHEDULED_REPEAT | int | 重复投递的次数 |
AMQ_SCHEDULED_CRON | String | 使用CRON表达式设置定时投递规则 |
ActiveMQ默认是不支持延迟投递和定时投递的,需要我们更改activemq.xml配置文件,使其支持延迟投递和定时投递:给<broker>节点添加schedulerSuppoort属性,并将属性值置为true即可
<!-- 参考官网http://activemq.apache.org/delay-and-schedule-message-delivery.html -->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">
...
</broker>
//省略部分代码……
TextMessage textMessage = session.createTextMessage("这是一个消息" + System.currentTimeMillis());
//延迟投递,消息到达mq服务器后,10秒后才会发给消费者
//textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10000);
//重复投递次数,1次,注意是int类型
//textMessage.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 1);
//重复投递间隔时间,5秒
//textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, 5000);
//cron表达式,注意:cron是操作系统的表达式,第一个参数是分钟,现在设的是指每分钟发送一次
//cron表达式的优先级高于另外三个参数,如果在设置了cron的同时,也有repeat和period参数,则会在每次cron执行的时候,重复投递repeat次,每次间隔为period,就是说设置是叠加的效果
textMessage.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "* * * * *");
//这些调度任务可以单独使用,也可以一起使用
//注意:不管发送多少次,发送的内容是不会改变的,别看我这里是发送的时间戳,就以为每次的内容会变化
messageProducer.send(textMessage);