衡水做网站推广的公司,湖南长沙发掘了3座西汉时期墓葬,装饰公司网站源码下载,百度权重网站排名延时队列
在开发中#xff0c;有时需要使用延时队列。
比如#xff0c;订单15分钟内未支付自动取消。
jdk延时队列
如果使用 jdk自带的延时队列#xff0c;那么服务器挂了或者重启时#xff0c;延时队列里的数据就会失效#xff0c;可用性比较差。
Redisson延时队列 …延时队列
在开发中有时需要使用延时队列。
比如订单15分钟内未支付自动取消。
jdk延时队列
如果使用 jdk自带的延时队列那么服务器挂了或者重启时延时队列里的数据就会失效可用性比较差。
Redisson延时队列
可以使用Redisson的延时队列。
Redisson的配置详情见https://blog.csdn.net/sinat_32502451/article/details/133799192
在延时队列中添加任务 public void addDelayQueue(String orderId) {RBlockingDequeString blockingDeque redissonClient.getBlockingDeque(orderQueue);RDelayedQueueString delayedQueue redissonClient.getDelayedQueue(blockingDeque);//在延时队列中添加任务5秒后生效delayedQueue.offer(orderId, 5, TimeUnit.SECONDS);log.info(addDelayQueue orderId: orderId);}取出延时队列中的任务
取出延时队列中的任务如果延时队列中没有任务会阻塞直到队列中添加了任务。
public void takeDelayQueue() {log.info(DelayQueue take start.);RBlockingDequeString blockingDeque redissonClient.getBlockingDeque(orderQueue);RDelayedQueueString delayedQueue redissonClient.getDelayedQueue(blockingDeque);while (true) {String orderId null;try {//取出延时队列中的任务如果延时队列中没有任务会阻塞直到队列中添加了任务。orderId blockingDeque.take();} catch (Exception e) {log.error(blockingDeque.take error., e);}if (orderId ! null) {log.info(DelayQueue get orderId: orderId);//实际情况不需要break此处为了方便调试break;}}}日志
异步调用 takeDelayQueue()方法不断在延时队列中拉取数据由于队列中没有数据所以该方法会先阻塞。
接着调用 addDelayQueue()方法往队列中添加数据观察日志可以发现 5秒后取到队列中的数据。
[2023-10-12 21:30:49.536] INFO c.c.m.c.controller.DelayQueueController [line: 63] DelayQueue take start.
[2023-10-12 21:30:54.725] INFO c.c.m.c.controller.DelayQueueController [line: 54] addDelayQueue orderId:12345
[2023-10-12 21:30:59.821] INFO c.c.m.c.controller.DelayQueueController [line: 72] DelayQueue get orderId:12345参考资料
https://blog.csdn.net/sinat_32502451/article/details/133799192 https://blog.csdn.net/qq_27818157/article/details/107514319