延时队列的使用

本文介绍了如何使用Redisson实现延时队列,包括添加延时任务到队列、从队列中获取并执行任务的逻辑。通过创建监听器并在项目启动时初始化,实现了任务的监听和处理。利用线程池执行延时任务,并确保在执行任务时注入了Spring容器中的业务逻辑实现类。
摘要由CSDN通过智能技术生成

延时队列实现的包装类
其中addQueue负责往队列中添加延时任务
添加后会把任务对象加入RDelayedQueue中,让监听器监听

getQueue负责获得任务以及监听
//当队列为空时挂起当前线程,不会消耗CPU
//take去除队列中首位对象并获取这个对象,如果Queue为空则等待
//然后让监听器执行这个对象的任务

@Component
public class RedisDelayedQueue {
   

    private final static Logger LOGGER = LoggerFactory.getLogger(RedisDelayedQueue.class);

    @Autowired
    private RedissonClient redissonClient;

    /**
     * 任务回调监听
     *
     * @param <T>
     */
    public abstract static class BaseDelayTaskEventListener<T> {
   
        /**
         * 执行方法
         *
         * @param t
         */
        public abstract void invoke(T t);
    }

    /**
     * 添加队列
     *
     * @param t        DTO传输类
     * @param delay    时间数量
     * @param timeUnit 时间单位
     * @param <T>      泛型
     */
    public <T> void addQueue(T t, long delay, TimeUnit timeUnit) {
   
        RBlockingQueue<T> blockingFairQueue = redissonClient.getBlockingQueue(t.getClass().getName());
        RDelayedQueue<T> delayedQueue = redissonClient.getDelayedQueue(blockingFairQueue);
        delayedQueue.offer(t, delay, timeUnit);
        LOGGER.info("发送延时消息<<=====>>队列:{},延时:{} 秒,消息内容:{}", t.getClass().getName(), delay, t.toString());
        //delayedQueue.destroy();
    }

    /**
     * 获取队列
     *
     * @param zClass            DTO泛型
     * @param taskEventListener 任务回调监听
     * @param <T>               泛型
     * @return
     */
    public <T> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值