如何查看网站cms系统,导视设计师,自己做网站 知乎,wordpress 转 typecho延迟队列是指在队列中存储带有过期时间的数据#xff0c;在过期时间到达时自动从队列中移除。 延时队列的使用场景#xff1a;
订单超过15分钟未支付自动取消推送数据至第三方平台#xff0c;如果失败重新入队推送#xff0c;推送间隔时间随着失败次数增加而扩大。分布式情… 延迟队列是指在队列中存储带有过期时间的数据在过期时间到达时自动从队列中移除。 延时队列的使用场景
订单超过15分钟未支付自动取消推送数据至第三方平台如果失败重新入队推送推送间隔时间随着失败次数增加而扩大。分布式情况下一个定时任务往队列内推多个实例同时处理任务。
Redisson实现的延迟队列是基于Redis的zset命令实现的通过将数据存储到zset中并设置过期时间作为score通过定时任务轮询zset来实现延迟队列的功能。
以下提供一个 RedisDelayQueueUtil 来简化操作。
Slf4j
Component
public class RedisDelayQueueUtil implements ApplicationContextAware {private static RedissonClient redissonClient;/*** 添加延迟队列* param value 队列值* param delay 延迟时间* param timeUnit 时间单位* param queueCode 队列键* param T*/public static T void addDelayQueue(T value, long delay, TimeUnit timeUnit, String queueCode){try {RBlockingDequeObject blockingDeque redissonClient.getBlockingDeque(queueCode);RDelayedQueueObject delayedQueue redissonClient.getDelayedQueue(blockingDeque);delayedQueue.offer(value, delay, timeUnit);log.info(Redisson添加延时队列成功 队列键{}队列值{}延迟时间{}, queueCode, value, timeUnit.toSeconds(delay) 秒);} catch (Exception e) {log.error(Redisson添加延时队列失败 {}, e.getMessage());throw new RuntimeException(Redisson添加延时队列失败);}}/*** 获取延迟队列 - 会阻塞* param queueCode 队列名称* return T 数据* throws InterruptedException*/public static T T getDelayQueue(String queueCode) throws InterruptedException {RBlockingDequeT blockingDeque redissonClient.getBlockingDeque(queueCode);return blockingDeque.take();}Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {RedisDelayQueueUtil.redissonClient applicationContext.getBean(RedissonClient.class);}
}