Redisson延时队列使用相关记录

422 阅读1分钟

基本知识介绍


  • 通过 delayedQueue.offer() 提交延时任务
  • delayedQueue 会按照延迟时间,将任务放置目标队列 blockingQueue
  • 通过 rBlockingQueue.take() 去取任务执行,注意 rBlockingQueue.take() 是一个阻塞方法

客户端相关命令


  1. llen redisson_delay_queue:{XXXXXXXX_XXXX_XXXX}

查看延时队列长度

  1. lindex redisson_delay_queue:{XXXXXXXX_XXXX_XXXX} 0/1/2/3/...

查看延时队列的某一个元素

问题记录


  1. 服务重启之后,延时任务没有按时执行

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;
                }
            }
        });
  }