【无标题】

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

部分测试日志
![在这里插入图片描述](https://img-blog.csdnimg.cn/86b850683e9d4f6c994fca1da2badc11.png

当延时设置为1分40秒的时候,take()的速度为1秒一条,设置为5分钟的时候差不多延时2分半,服务器的时间和redis里面执行的time一致的,当切换为新队列的时候不会发生
求大佬帮忙看看什么原因导致的
redisson版本3.17.6
redis版本5.0.9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值