ActiveMQ笔记(6):消息延时投递
时间:2022-04-22
本文章向大家介绍ActiveMQ笔记(6):消息延时投递,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在开发业务系统时,某些业务场景需要消息定时发送或延时发送(类似:飞信的短信定时发送需求),这时候就需要用到activemq的消息延时投递,详细的文档可参考官网说明,本文只介绍二种常用的用法:
注:本文采用spring的JmsTemplate来发送消息
步骤1、首先要修改activemq.xml配置文件,启用延时投递
1 <broker xmlns="http://activemq.apache.org/schema/core" ... schedulerSupport="true" >
2 ...
3 </broker>
即:在broker节点加上schedulerSupport="true",然后重启activemq即可
步骤2、定义一个MessagePostProcessor的实现类
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发送示例
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官方文档
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 绕安全狗的那些事
- single-spa 基础概念
- DVWA-对Command Injection(命令注入)的简单演示与分析
- 如何探测内网存活主机
- Java ServletContext详解
- Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)
- 实战记录之SQL server报错手工注入
- 树莓派基础实验23:触摸开关传感器实验
- springmvc 文件下载 VS resteasy 文件上传下载
- Struts Scan工具的使用
- 树莓派基础实验24:超声波测距传感器实验
- 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解
- 从spring boot 启动过程看apollo的初始化过程( 二)
- Apache IoTDB 系列教程-4:客户端接口
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解