延时队列实现的包装类
其中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>