基本知识介绍
- 通过 delayedQueue.offer() 提交延时任务
- delayedQueue 会按照延迟时间,将任务放置目标队列 blockingQueue
- 通过 rBlockingQueue.take() 去取任务执行,注意 rBlockingQueue.take() 是一个阻塞方法
客户端相关命令
- llen redisson_delay_queue:{XXXXXXXX_XXXX_XXXX}
查看延时队列长度
- lindex redisson_delay_queue:{XXXXXXXX_XXXX_XXXX} 0/1/2/3/...
查看延时队列的某一个元素
问题记录
- 服务重启之后,延时任务没有按时执行
delayedQueue 是在 redissonClient.getDelayedQueue(rBlockingQueue) 方法里面进行初始化的,所以当服务重启且没有新任务进行提交时,delayedQueue 一直没有进行初始化,也就无法执行任务
** 解决方法: 在初始化时,将 delayedQueue 也进行初始化 **
@Override
public void afterPropertiesSet() throws Exception {
scheduleExecutor.execute(() -> {
RBlockingQueue<DelayJob> rBlockingQueue =
redissonClient.getBlockingQueue(XXXXXX);
// 初始化delayedQueue,防止服务重启无法拿到任务
RDelayedQueue<DelayJob> delayedQueue =
redissonClient.getDelayedQueue(rBlockingQueue);
while (true) {
try {
DelayJob delayJob = rBlockingQueue.take();
taskExecutor.execute(() -> handler(delayJob));
} catch (InterruptedException e1) {
LOG.info("启动延时队列中断", e1);
Thread.currentThread().interrupt();
} catch (Exception e2) {
LOG.info("启动延时队列异常", e2);
break;
}
}
});
}