spring 实现activemq延时投递

在开发业务系统时,某些业务场景需要消息定时发送或延时发送(类似:飞信的短信定时发送需求),这时候就需要用到activemq的消息延时投递,详细的文档可参考官网说明,本文只介绍二种常用的用法:

注:本文采用spring的JmsTemplate来发送消息

步骤1、首先要修改activemq.xml配置文件,启用延时投递(注:schedulerSupport="true" 的位置要在最外面,否则不生效

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

即:在broker节点加上schedulerSupport="true",然后重启activemq即可

 

步骤2、定义一个MessagePostProcessor的实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import  javax.jms.JMSException;
import  javax.jms.Message;
 
import  lombok.Data;
import  org.apache.activemq.ScheduledMessage;
import  org.apache.commons.lang3.StringUtils;
import  org.springframework.jms.core.MessagePostProcessor;
 
/**
  * MQ延时投递处理器(注:ActiveMQ的配置文件中,要配置schedulerSupport="true",否则不起作用)
  * by: 杨俊明 2016-06-16
  */
@Data
public  class  ScheduleMessagePostProcessor  implements  MessagePostProcessor {
 
     private  long  delay = 0l;
 
     private  String corn =  null ;
 
     public  ScheduleMessagePostProcessor( long  delay) {
         this .delay = delay;
     }
 
     public  ScheduleMessagePostProcessor(String cron) {
         this .corn = cron;
     }
 
     public  Message postProcessMessage(Message message)  throws  JMSException {
         if  (delay >  0 ) {
             message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
         }
         if  (!StringUtils.isEmpty(corn)) {
             message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, corn);
         }
         return  message;
     }
 
}

 

步骤3、jmsTemplate发送示例

1
2
3
4
5
6
7
8
9
10
11
12
13
Object message1 =  "corn消息内容:"  + DateUtil.formatDate( new  Date());
//分 时 天 月 星期几
jmsTemplate.convertAndSend(message1,  new  ScheduleMessagePostProcessor( "40 22 * * *" ));
logger.info( "消息1:["  + message1 +  "] 延时发送成功!" );
 
jmsTemplate.convertAndSend(message1,  new  ScheduleMessagePostProcessor( "50 22 * * *" ));
logger.info( "消息1:["  + message1 +  "] 延时发送成功!" );
 
 
Object message2 =  "message:"  + DateUtil.formatDate( new  Date());
jmsTemplate.convertAndSend(message2,  new  ScheduleMessagePostProcessor( 30  1000 )); //延时30秒
jmsTemplate.convertAndSend(message2,  new  ScheduleMessagePostProcessor( 3600  24  1000 )); //延时24小时
logger.info( "消息2:["  + message2 +  "] 延时发送成功!" );

上面的代码演示了二种延时的用法:延时N毫秒、按corn表达式延时(注:此corn表达式并非Quartz框架中的corn表达式,而是linux中corntab中的表达 式,基本顺序是"分(0-59) 时(0-23) 日(1-31) 月(1-12) 星期几(1-7) ")

 

发送成功后,可以登录activemq的webconsole查看消息的属性:

在scheduled面板中,可以看到延时的消息

点击看大图

注:在开启消息持久化存储的前提下,就算把相应的queue在webconsole面板中删除(即删除队列),只要投递的时间尚未到,该消息也不会删除,仍然能正常延时投递。

此外,在queues面板中,如何查看某条具体的消息,也可以通过属性发现这条消息是延时消息,参考下图:

点击看大图

 

参考文章:
1、Delay and Schedule Message Delivery

2、喂鸡百科上的Corn表达式解释 (中文)

3、喂鸡百科上的Corn表达式解释 (英文)

4、kahaDB官方文档

 

作者: 菩提树下的杨过
出处: http://yjmyzz.cnblogs.com 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值