标题redisson实现延时队列,消息延时设置为1分钟,但是take的时候立刻从blockQueue取出来了【求解】
延时的时间配置在数据库中,take到消息的时候会从数据库读取配置,动态的设置消息延时时间
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 8, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(500), r -> new Thread(r, "db_delay_msg_" + atomicInteger.incrementAndGet()));
private static ThreadPoolExecutor jyThreadPoolExecutor = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(500), r -> new Thread(r, "jy_delay_msg_" + atomicInteger.incrementAndGet()));
@PostConstruct
public void init() {
messageUtil = this;
messageUtil.blockingQueue = this.blockingQueue;
messageUtil.delayedQueue = this.delayedQueue;
messageUtil.jYBlockingDeque = this.jYBlockingDeque;
messageUtil.jYDelayedQueue = this.jYDelayedQueue;
threadPoolExecutor.execute(this::dbAccept);
jyThreadPoolExecutor.execute(this::jyAccept);
}
public static void sendDelayMsg(List<Long> msgIds, Long time, TimeUnit timeUnit) {
//time 和 timeUnit 是配置在数据库中的,动态的延时
log.info("【发送代办延时消息】 msgIds = {} time = {} timeUnit = {}", JsonUtils.toJsonString(msgIds), time, timeUnit);
messageUtil.delayedQueue.offer(msgIds, time, timeUnit);
}
private void dbAccept() {
log.info("代办开始拉取数据");
while (true) {
try {
List<Long> msgIds = blockingQueue.take();
log.info("获取代办延时队列消息成功 msgIds = {}", msgIds);
threadPoolExecutor.execute(() -> {
//处理消息
})
catch (Exception e) {
log.error("获取代办延时队列消息异常 e = " + e);
}
}
部分测试日志
当延时设置为1分40秒的时候,take()的速度为1秒一条,设置为5分钟的时候差不多延时2分半,服务器的时间和redis里面执行的time一致的,当切换为新队列的时候不会发生
求大佬帮忙看看什么原因导致的
redisson版本3.17.6
redis版本5.0.9