ppgjx 发表于 2024-8-15 22:33

Redisson延迟队列客户端挂掉的问题请教

假设我使用的是spring boot 然后写了一个添加延迟队列的接口
@Controller
@Api(tags = "测试模块")
@RequestMapping("/test")
@Slf4j
public class TestController {
    @Autowired
    private RedissonClient redissonClient;

    private static final String QUEUE_NAME = "myDelayedQueue";


    @ResponseBody
    @RequestMapping(value = "/add",method = RequestMethod.POST)
    @ApiOperation(value = "add")
    public Result addQ( HttpServletRequest request, HttpServletResponse response){
      addTaskToDelayedQueue("123",10,TimeUnit.SECONDS);
      return Result.success();
    }

    // 添加任务到延迟队列
    public void addTaskToDelayedQueue(String task, long delay, TimeUnit timeUnit) {
      RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(redissonClient.getQueue(QUEUE_NAME));
      delayedQueue.offer(task, delay, timeUnit);
    }

}


然后做了一个定时任务去接收延迟队列消息
    @Autowired
    private RedissonClient redissonClient;

    private static final String QUEUE_NAME = "myDelayedQueue";


    // 处理队列中的任务
    @Scheduled(cron = "0/1 * * * * *") // 每分钟检查一次队列
    public void processDelayedQueue() {

      RQueue<String> queue = redissonClient.getQueue(QUEUE_NAME);
      String task;
      while ((task = queue.poll()) != null) {
            // 处理任务
            System.out.println("Processing task: " + task);
      }
    }


正常来说 我请求接口 十秒后这个任务接收到 但是如果我这样操作

请求接口成功后关掉spring boot,等待20秒后,再启动后这个任务就暂时不会收到,只有我再次去调用添加的接口,才会收到这个任务,有什么办法能让他启动后能立即收到这个消息吗?

许我浅笑而安 发表于 2024-8-15 23:24

本帖最后由 许我浅笑而安° 于 2024-8-15 23:27 编辑

@Component
public class StartupRunner implements CommandLineRunner {

    @Autowired
    private RedissonClient redissonClient;

    @Autowired
    private TaskRepository taskRepository; // 假设这是一个JPA仓库,用于访问存储任务的数据库

    @Override
    public void run(String... args) throws Exception {
      List<Task> tasks = taskRepository.findAll();
      tasks.forEach(task -> {
            addTaskToDelayedQueue(task.getPayload(), task.getDelay(), TimeUnit.SECONDS);
      });
    }

    private void addTaskToDelayedQueue(String task, long delay, TimeUnit timeUnit) {
      RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(redissonClient.getQueue(QUEUE_NAME));
      delayedQueue.offer(task, delay, timeUnit);
    }
}

静似晨荷 发表于 2024-8-16 09:03

我是来学习的

gwsgws 发表于 2024-8-16 09:06


我是来学习的

beimo 发表于 2024-8-16 09:43

我是来学习的
页: [1]
查看完整版本: Redisson延迟队列客户端挂掉的问题请教