MQ的定时任务改装,实现自定义定时:MQ+redis
package com.*.server.live.listener; import com.*.common.core.entity.constant.LiveConstant;
import com.*.common.redis.service.RedisService;
import com.*.server.live.core.recreation.LiveRecreation;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Service; import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutorService; /**
* 功能描述:自定义倒计时
* 作者:唐泽齐
*/
@Slf4j
@Service
@RequiredArgsConstructor
@RocketMQMessageListener(consumerGroup = TopConstant.STUDIO_RECREATION, topic = TopConstant.STUDIO_RECREATION)
public class StudioRecreationRocketMQListener implements RocketMQListener { //rockteMQ延时 1s、 5s、 10s、 30s、 1m、 2m、 3m、 4m、 5m、 6m、 7m、 8m、 9m、 10m、 20m、 30m、 1h、 2h
final static private List<Long> delays = Arrays.asList(1l,5l,10l,30l,1*60l,2*60l,3*60l,4*60l,5*60l,6*60l,7*60l,8*60l,9*60l,10*60l,20*60l,30*60l,1*60*60l,2*60*60l); final private RedisService redisService; final RocketMQTemplate rocketMQTemplate; final ExecutorService fixedThreadPool; final LiveRecreation liveRecreation; @Override
public void onMessage(Object message) {
log.info(LiveConstant.STUDIO_RECREATION+":"+message);
if(!redisService.hasKey(message.toString())) {
return;
}
//获取到期时间
Long expire = redisService.getExpire(message.toString());
//获取延时级别
int delay = getDelay(expire-5l);
//无需延时则立即执行
if(delay == 0) {
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
liveRecreation.run(message.toString());
}
});
}
//需要延时则推送延时信息到MQ
else {
rocketMQTemplate.asyncSend(TopConstant.STUDIO_RECREATION, new GenericMessage<>(message.toString()), new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
log.info("Recreation===>delay::****未到时,继续等待====》"+message);
} @SneakyThrows
@Override
public void onException(Throwable e) {
log.error("Recreation===>error::****计时异常,开始无限重试模式====》"+message,e);
onMessage(message);
}
},60l,delay);
}
} /**
*
* 获取延时级别
* @return
*/
private Integer getDelay(Long delay) {
int level= 0;
//如果小于等于1秒则无需延时
if(delay>1l){
for (int i = 0; i < delays.size(); i++) {
if(delay<delays.get(i)) {
break;
}
level = i;
}
}
return level;
}
}
MQ的定时任务改装,实现自定义定时:MQ+redis的更多相关文章
- 为什么要使用MQ和到底什么时候要使用MQ
一.缘起 一切脱离业务的架构设计与新技术引入都是耍流氓. 引入一个技术之前,首先应该解答的问题是,这个技术解决什么问题. 就像微服务分层架构之前,应该首先回答,为什么要引入微服务,微服务究竟解决什 ...
- Linux命令之Crontab定时任务,利用Crontab定时执行spark任务
Linux命令之Crontab定时任务,利用Crontab定时执行spark任务 一.Linux命令之Crontab定时任务 1.1 常见Crontab任务 1.1.1 安装crontab 1.1.2 ...
- Django自定义指令+mq消息队列的使用
import pika import json import logging import base64 from rest_framework.exceptions import ParseErro ...
- 树莓派加入定时任务实现花生壳定时重启(linux的定时任务)
由于花生壳在linux下不稳定,联系开机一个星期左右会挂掉,所以要使用定时任务实现每小时刷新一次/启动一次. 使用的是linux下的定时任务crontab去实现. 实现步骤: 1.编辑/etc/cro ...
- windows 定时任务:schtasks,定时关闭网易云音乐
大部分属于转载和粘贴. 使用命令:schtasks windows 定时任务 使用样例: 每天定时关闭网易云音乐: 每天22:20关闭网易云音乐: schtasks /create /tn &qu ...
- spring定时任务.线程池,自定义多线程配置
定时任务及多线程配置xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- OSX系统添加定时任务 Linux crontab命令 定时执行py 文件 任务
#输出日志 #将日志输入到2.log文件中无论错误还是正确02 15 * * * . ~/xad/pyenv/xadserver/bin/activate && cd /root/xa ...
- HttpRuntime自定义定时更新缓存
缓存更新类如下: /// <summary> /// 缓存更新类 /// </summary> /// <typeparam name="T"> ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十一 || AOP自定义筛选,Redis入门 11.1
代码已上传Github+Gitee,文末有地址 书说上文<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之十 || AOP面向切面编程浅 ...
- SpringBoot使用自定义注解+AOP+Redis实现接口限流
为什么要限流 系统在设计的时候,我们会有一个系统的预估容量,长时间超过系统能承受的TPS/QPS阈值,系统有可能会被压垮,最终导致整个服务不可用.为了避免这种情况,我们就需要对接口请求进行限流. 所以 ...
随机推荐
- 2个月搞定计算机二级C语言——真题(10)解析
1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题10 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> #pragma warning ...
- 开源 - Ideal库 - 特殊时间扩展方法(三)
书接上回,我们继续来分享一些关于特殊时间获取的常用扩展方法. 01.获取当天的开始时间 当天的开始时间指00:00:00时刻,因此只需要获取DateTime的Date属性只获取时间即可,具体代码如下: ...
- 使用 JuiceFS 快照功能实现数据库发布与端到端测试
今天的博客来自 JuiceFS 云服务用户 Jerry,他们通过使用 JuiceFS snapshot 功能,创新性地实现了数据的版本控制.Jerry,是一家位于北美的科技公司,利用人工智能和机器学习 ...
- 干货分享:Air700ECQ的硬件设计,第一部分
一.绪论 Air700ECQ是一款基于移芯EC716E平台设计的LTE Cat 1无线通信模组.支持移动双模FDD-LTE/TDD-LTE的4G远距离无线传输技术.以极小封装,极高性价比,满足Io ...
- element 动态合并表格---进阶版
错误展示 正确展示 如果使用上次博客写的element 动态合并表格那么会出现上述图片情况,所以对其进行完善实现下图(正确展示)情况 处理函数 mergeTableRow(data, merge) { ...
- LNMP一键安装
PHP环境快捷搭建工具: https://lnmp.org/ [安装] wget https://soft.lnmp.com/lnmp/lnmp2.1.tar.gz -O lnmp2.1.tar.gz ...
- AtCoder Beginner Contest 295
Three Days Ago 我们定义一个只由数字构成的字符串中的字符能够被重排成相同的两份,我们称这个字符串是个好字符串,比如12341234 现在给定一个字符串\(S\),找出所有的\([l,r] ...
- ZCMU-1111
与背包和动态规划有关(我认为) 采用dp数组存放吃掉i千克食物要用掉的钱 dp最开始要尽量的大方便过程中判断和最后的输出判断 实时更新dp,保留最小的钱 以前不知道的 printf函数可以这样用 fi ...
- ArkTs布局入门03——层叠布局(Stack)
1.概述 叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局.层叠布局通过Stack容器组件实现位置的固定定位与层叠,容器中的子元素(子组件)依次入栈, ...
- Centos使用图形化界面配置网络
1. 查看当前ip地址 # ip addr 2. 图形化界面配置网卡 # nmtui 界面提示,左右上下配置,OK即可.