Redis延时队列方案

总体方案
创建一个定时任务,每一次执行完后间隔一定时间就会扫描缓存,缓存中一旦添加了任务,就会被扫描到,然后发送到消息队列,监听器一旦监听到消息就会进行处理,如果处理失败,则再次生成任务(次数加1,时间戳会根据规则增加),到达规定次数后则不在执行

具体细节
首先创建一个执行完后间隔’ w e b h o o k . f i x e d D e l a y ’ 后 执 行 下 一 次 , 从 缓 存 中 取 出 数 据 , 一 旦 取 到 数 据 就 发 送 到 消 息 队 列 中 , 并 且 删 除 掉 缓 存 里 面 的 数 据 ! [ 在 这 里 插 入 图 片 描 述 ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / 2019041020062966. p n g ? x − o s s − p r o c e s s = i m a g e / w a t e r m a r k , t y p e Z m F u Z 3 p o Z W 5 n a G V p d G k , s h a d o w 1 0 , t e x t a H R 0 c H M 6 L y 9 i b G 9 n L m N z Z G 4 u b m V 0 L 3 d l a X h p b l 80 N D M y M T k 0 M g = = , s i z e 1 6 , c o l o r F F F F F F , t 7 0 ) 监 听 器 一 旦 监 听 到 消 息 就 会 进 行 处 理 , 如 果 处 理 失 败 , 则 再 次 生 成 任 务 ( 次 数 加 1 , 时 间 戳 会 根 据 规 则 增 加 ) , 到 达 规 定 次 数 后 则 不 在 执 行 @ R a b b i t L i s t e n e r ( q u e u e s = " {webhook.fixedDelay}’后执行下一次,从缓存中取出数据,一旦取到数据就发送到消息队列中,并且删除掉缓存里面的数据 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019041020062966.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMyMTk0Mg==,size_16,color_FFFFFF,t_70) 监听器一旦监听到消息就会进行处理,如果处理失败,则再次生成任务(次数加1,时间戳会根据规则增加),到达规定次数后则不在执行 @RabbitListener(queues = " webhook.fixedDelay,,,![](https://imgblog.csdnimg.cn/2019041020062966.png?xossprocess=image/watermark,typeZmFuZ3poZW5naGVpdGk,shadow10,textaHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMyMTk0Mg==,size16,colorFFFFFF,t70)1@RabbitListener(queues="{webhook.queue}")
// 参数中使用@Header获取mesage
public void helloReply(String json) {
logger.debug(“task:{}”, json);
Task task = gson.fromJson(json, Task.class);
try {
handler.handler(task.getData());
} catch (Exception e) {
if (webhookUtil.getInterval().size() > task.getTimes()) {
Task next = new Task();
next.setTimes(task.getTimes() + 1);
next.setTimestamp(task.getTimestamp() + webhookUtil.getInterval().get(task.getTimes())*1000);
next.setData(task.getData());
webhookUtil.addNext(next);
if (logger.isDebugEnabled()) {
logger.debug(“处理失败,添加到下次执行:” + gson.toJson(task), e);
}
} else {
logger.error(“处理{}次失败,停止处理”, webhookUtil.getInterval().size(), e);
}
}

}

测试
向缓存中添加一条数据,定时任务会到时间自动检测到这条数据
Redis延时队列方案_第1张图片
配置文件
spring-mq.xml
Redis延时队列方案_第2张图片
在这里插入图片描述
Redis延时队列方案_第3张图片
Redis延时队列方案_第4张图片

你可能感兴趣的:(MySQL,python)