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的更多相关文章

  1. 为什么要使用MQ和到底什么时候要使用MQ

      一.缘起 一切脱离业务的架构设计与新技术引入都是耍流氓. 引入一个技术之前,首先应该解答的问题是,这个技术解决什么问题. 就像微服务分层架构之前,应该首先回答,为什么要引入微服务,微服务究竟解决什 ...

  2. Linux命令之Crontab定时任务,利用Crontab定时执行spark任务

    Linux命令之Crontab定时任务,利用Crontab定时执行spark任务 一.Linux命令之Crontab定时任务 1.1 常见Crontab任务 1.1.1 安装crontab 1.1.2 ...

  3. Django自定义指令+mq消息队列的使用

    import pika import json import logging import base64 from rest_framework.exceptions import ParseErro ...

  4. 树莓派加入定时任务实现花生壳定时重启(linux的定时任务)

    由于花生壳在linux下不稳定,联系开机一个星期左右会挂掉,所以要使用定时任务实现每小时刷新一次/启动一次. 使用的是linux下的定时任务crontab去实现. 实现步骤: 1.编辑/etc/cro ...

  5. windows 定时任务:schtasks,定时关闭网易云音乐

    大部分属于转载和粘贴. 使用命令:schtasks windows 定时任务   使用样例: 每天定时关闭网易云音乐: 每天22:20关闭网易云音乐: schtasks /create /tn &qu ...

  6. spring定时任务.线程池,自定义多线程配置

    定时任务及多线程配置xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  7. OSX系统添加定时任务 Linux crontab命令 定时执行py 文件 任务

    #输出日志 #将日志输入到2.log文件中无论错误还是正确02 15 * * * . ~/xad/pyenv/xadserver/bin/activate && cd /root/xa ...

  8. HttpRuntime自定义定时更新缓存

    缓存更新类如下: /// <summary> /// 缓存更新类 /// </summary> /// <typeparam name="T"> ...

  9. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十一 || AOP自定义筛选,Redis入门 11.1

    代码已上传Github+Gitee,文末有地址 书说上文<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之十 || AOP面向切面编程浅 ...

  10. SpringBoot使用自定义注解+AOP+Redis实现接口限流

    为什么要限流 系统在设计的时候,我们会有一个系统的预估容量,长时间超过系统能承受的TPS/QPS阈值,系统有可能会被压垮,最终导致整个服务不可用.为了避免这种情况,我们就需要对接口请求进行限流. 所以 ...

随机推荐

  1. ubuntu20.04手动换源——个人向

    备份你的源,然后替换你的 Linux 主机上 /etc/apt/source.list 即可. 笔者用的源如下: 点击查看代码 # deb cdrom:[Ubuntu 20.04.4 LTS _Foc ...

  2. 一个专注推荐.Net开源项目的榜单

    大家好,我是编程乐趣,从7月份开始推荐开源项目,已经推荐了接近100个开源项目了,其中绝大部分是有关.Net的开源项目,也受到大家非常多人的喜欢. 由于公众号不方便查询,很多人又想了解更多的开源项目, ...

  3. 使用技巧 | 红米 Redmi Note 12 Turbo优化记录(去广告等)

    原文链接:https://engapi.com/article/7569 原文也是我写的. 我的红米Redmi note8 pro 6+128已有些卡顿,遂在K70推出之际下单了Redmi Note ...

  4. 5、oracle内存及进程操作讲解

    内存结构 1.shared pool 缓存着sql.sql执行计划 查询shared pool大小: select * from v$sga_dynamic_components; 2.buffer ...

  5. linux学习用到的命令

    创建快件方式 ln 创建目录的快件方式 sudo ln -s /root/myhack/ /root/Desktop以上指令是创建软链接到桌面. ln -s /mnt/hgfs/VMware_shar ...

  6. Contrastive Learning 对比学习 | RL 学 representation 时的对比学习

    记录一下读的三篇相关文章. 01. Representation Learning with Contrastive Predictive Coding arxiv:https://arxiv.org ...

  7. 2022 Hangzhou Normal U Summer Trials

    Subarrays 给定一个长度为n的由正整数组成的序列,请你输出该序列中子段和能被\(k\)整除的所有符合要求的子段数量 题解:组合计数 + 前缀和 + 思维 \[sum[l,r]\ \ mod\ ...

  8. Select、Poll、Epoll 有什么区别?

    部分图片来源于:https://www.cnblogs.com/yanguhung/p/10145755.html I/O模型 BIO:同步阻塞IO 应用程序发起调用以后,一直阻塞,等待结果返回 2. ...

  9. 用人工智能模型预测股市和加密货币的K线图

    前一篇:<从爱尔兰歌曲到莎士比亚:LSTM文本生成模型的优化之旅> 前言:加密货币市场昨日大幅下跌,一天内市值蒸发逾70亿 人民币.有人可能会问,如果使用人工智能模型预测市场的涨跌,是否能 ...

  10. 《Django 5 By Example》阅读笔记:p521-p542

    <Django 5 By Example>学习第 18 天,p521-p542 总结,总计 22 页. 一.技术总结 1.django-parler django-parler 用于 mo ...