java 延时队列DelayQueue
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java 延时队列DelayQueue,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2288字,纯文字阅读大概需要4分钟。
内容图文
![java 延时队列DelayQueue](/upload/InfoBanner/zyjiaocheng/607/c4401b8eebb34649b6f7636bbb6238ea.jpg)
今天遇到 支付超时,取消订单的
实现方式 :https://blog.csdn.net/chrishe751/article/details/108390928
最简单的方式,定时扫表;例如每分钟扫表一次十分钟之后未支付的订单进行主动支付 ;
优点: 简单
缺点: 每分钟全局扫表,浪费资源,有一分钟延迟
使用RabbitMq 实现 RabbitMq实现延迟队列
优点: 开源,现成的稳定的实现方案;
缺点: RabbitMq是一个消息中间件;延迟队列只是其中一个小功能,如果团队技术栈中本来就是使用RabbitMq那还好,如果不是,那为了使用延迟队列而去部署一套RabbitMq成本有点大;
使用Java中的延迟队列,DelayQueue
优点: java.util.concurrent包下一个延迟队列,简单易用;拿来即用
缺点: 单机、不能持久化、宕机任务丢失等等;
问题: 目前没有用RabbitMq,但是有redis
方案:使用Java中的延迟队列,DelayQueue
1. 添加订单到队列,同时添加到redis
2.弹出队列,同时删除redis 中的订单
DelayQueue:简单显例
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; import org.junit.Test; public class TestQueue { /** * @description: 延时队列测试 * @author: hh */ @Test public void testRun() throws InterruptedException { Item item1 = new Item("item1", 5, TimeUnit.SECONDS); Item item2 = new Item("item2",10, TimeUnit.SECONDS); Item item3 = new Item("item3",15, TimeUnit.SECONDS); DelayQueue<Item> queue = new DelayQueue<>(); queue.put(item1); queue.put(item2); queue.put(item3); System.out.println("begin time:" + LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); for (int i = 0; i < 3; i++) { Item take = queue.take(); System.out.format("name:{%s}, time:{%s}\n",take.name, LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME)); } } //// 消息体,必须实现Delayed接口 class Item implements Delayed{ /* 触发时间*/ private long time; // 延迟时长,这个是必须的属性因为要按照这个判断延时时长。 private String name; public Item(String name, long time, TimeUnit unit) { this.name = name; this.time = System.currentTimeMillis() + (time > 0? unit.toMillis(time): 0); } @Override public long getDelay(TimeUnit unit) { return time - System.currentTimeMillis(); } @Override public int compareTo(Delayed o) { Item item = (Item) o; long diff = this.time - item.time; if (diff <= 0) {// 改成>=会造成问题 return -1; }else { return 1; } } @Override public String toString() { return "Item{" +"time=" + time +", name='" + name + '\'' +'}'; } } }
内容总结
以上是互联网集市为您收集整理的java 延时队列DelayQueue全部内容,希望文章能够帮你解决java 延时队列DelayQueue所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。