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;
    }
}
复制代码

 

posted on   instr  阅读(58)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示