之前有一篇文件讲到延时队列,用的是jdk的 DelayQueue实现的。
使用jdk的DelayQueue实现的缺点: 1.基于应用内存,重启或宕机后数据会丢失 2. 如果要集群,不好扩展
此处基于redis做一个可用性较高的延时队列。
Redisson中有延时队列的实现,可以直接拿来用
@Controller
@RequestMapping("order")
public class OrderController extends BaseController {
/**
* 下订单
*/
@PostMapping()
@ResponseBody
public WSResponseVO doOrder(){
//调用生成订单逻辑,并返回订单id
String orderId = UUID.randomUUID().toString();
RBlockingQueue<RedPacketMessage> blockingRedPacketQueue
= redissonClient.getBlockingQueue("orderDelayQueue");
RDelayedQueue<RedPacketMessage> delayedQueue
= redissonClient.getDelayedQueue(blockingRedPacketQueue);
//订单延时进入队列.延迟3秒后失效
delayedQueue.offer(new MyDelayMessage("001A"), 3, TimeUnit.SECONDS);
}
}
对于从队列中取元素消费跟使用jdk的差不多,只是队列要从redis中获取。其获取元素的API也是take().此处省略代码