ActiveMQ延迟和定时消息投递(Delay and Schedule Message Delivery)
2016-05-26 15:04
573 查看
由于业务需求,需要将mq的消息延迟投递,于是在网上找到了一些资料,都是讲解如何设置参数的,如下有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。类似这种需求,ActiveMQ提供了一种broker端消息定时调度机制。我们只需要把几个描述消息定时调度方式的参数作为属性添加到消息,broker端的调度器就会按照我们想要的行为去处理消息。一共有四个属性:
当然ActiveMQ也提供了一个封装的消息类型:org.apache.activemq.ScheduledMessage.使用示例,延迟60秒:
于是本按照此方法设置了,却始终不成功,百思不得其解。经过了一天的研究,后来终于在其官方网站找到了如下说明:ActiveMQ from version 5.4 has an optional persistent scheduler built into the ActiveMQ message broker. It is enabled by setting the broker schedulerSupport attribute to true in the xml configuration. 意思是说要在mq的xml配置文件中,broker节点处加入schedulerSupport属性,才能使mq的任务计划生效,于是,我尝试加入该属性修改activemq.xml 在<broker>里添加属性schedulerSupport="true" 重启mq后果然生效了。网上大部人只把如果设置参数翻译过来了,但是不说如何配置,这对于我们这些菜鸟小白来说真的伤不起呀。在这个地方纠结了好久。
Property name | type | description |
---|---|---|
AMQ_SCHEDULED_DELAY | long | 延迟投递的时间 |
AMQ_SCHEDULED_PERIOD | long | 重复投递的时间间隔 |
AMQ_SCHEDULED_REPEAT | int | 重复投递次数 |
AMQ_SCHEDULED_CRON | String | Cron表达式 |
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);延迟30秒,投递10次,间隔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 表达式的例子:
MessageProducer producer = session.createProducer(destination); TextMessage message = session.createTextMessage("test msg"); message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *"); producer.send(message);CRON表达式的优先级高于另外三个参数,如果在设置了CRON的同时,也有repeat和period参数,则会在每次CRON执行的时候,重复投递repeat次,每次间隔为period。就是说设置是叠加的效果。例如每小时都会发生消息被投递10次,延迟1秒开始,每次间隔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);
于是本按照此方法设置了,却始终不成功,百思不得其解。经过了一天的研究,后来终于在其官方网站找到了如下说明:ActiveMQ from version 5.4 has an optional persistent scheduler built into the ActiveMQ message broker. It is enabled by setting the broker schedulerSupport attribute to true in the xml configuration. 意思是说要在mq的xml配置文件中,broker节点处加入schedulerSupport属性,才能使mq的任务计划生效,于是,我尝试加入该属性修改activemq.xml 在<broker>里添加属性schedulerSupport="true" 重启mq后果然生效了。网上大部人只把如果设置参数翻译过来了,但是不说如何配置,这对于我们这些菜鸟小白来说真的伤不起呀。在这个地方纠结了好久。
相关文章推荐
- 使用springmvc中的RestTemplate向url地址post信息时乱码
- AC自动机入门题(HDU 2222 + HDU 2896)
- 史上最全的maven pom.xml文件教程详解
- ERROR:transport error 202: gethostbyname: unknown host
- 有关tomcat内存溢出的完美解决方法
- nginx location 匹配顺序
- Myeclipse快捷键大全
- 关于Spring嵌套事务
- solr4.7配置教程
- 设置虚拟机自启动
- Redis 3.2 GEO功能支持
- 在Java中连接字符串时是使用+号还是使用StringBuilder
- Java 单例模式详解
- 表单中基本组件使用1(Button,JLabel,JTextField,JPasswordField等)
- 经典网络语录
- 值得一读的语录
- 导航navigationItem
- SQL SERVER 2008为每个IP分配一个端口
- Python FTP例子
- 通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法