DelayQueue使用:DelayQueue是BlockingQueue的一种,所以它是线程安全的。时间到期后元素才能被取出使用,所以可以通过设置时间来控制元素输出顺序。使用DelayQueue首先需要实现Delayed:eg:@Datapublic class DelayItem  implements Delayed{/* 触发时间*/private long time;String delayKey;public DelayItem(String delayKey, long time, TimeUnit unit) {this.delayKey = delayKey;this.time = System.currentTimeMillis() + (time > 0 ? unit.toMillis(time) : 0);}@Overridepublic long getDelay(TimeUnit unit) {return time - System.currentTimeMillis();}@Overridepublic int compareTo(Delayed o) {DelayItem item = (DelayItem) o;long diff = this.time - item.time;if (diff <= 0) {// 改成>=会造成问题return -1;} else {return 1;}}}public class MemoryData {public static DelayQueue<DelayItem> delayQueue = new DelayQueue<>();}生产者可以通过redis记录详细数据,delatItem只记录redis的key。eg:redisBaseService.sAdd(key, value);DelayItem delayItem = new DelayItem(key, 1, TimeUnit.MINUTES);MemoryData.delayQueue.put(delayItem);消费者可以增加监听,每分钟监听延迟队列里是否存在到期数据,甚至启停服务时,将未处理的数据放入redis,下次起服务时,从redis中获取对应数据。eg:启动类:ConfigurableApplicationContext run =SpringApplication.run(Application.class, args);run.addApplicationListener(new DataMergeContainer());使用类:@Componentpublic class DataMergeContainer implements ApplicationListener<ApplicationStartedEvent>, DisposableBean {private static final Logger log = LoggerFactory.getLogger(DataMergeContainer.class);@Autowiredprivate RedisBaseService redisBaseService;private void peakData() {while (MemoryData.delayQueue.isEmpty()) {try {Thread.sleep(60000);} catch (InterruptedException e) {log.error("peakData sleep error", e);}}if (MemoryData.delayQueue.size() > 0) {for (int i = 0; i < MemoryData.delayQueue.size(); i++) {DelayItem take;try {take = MemoryData.delayQueue.take();String delayKey = take.getDelayKey();if (!StringUtils.isBlank(delayKey)) {//业务使用}} catch (InterruptedException e) {log.info("peakData getData error", e);}}}//递归处置peakData();}@Overridepublic void onApplicationEvent(ApplicationStartedEvent event) {log.info("DataMergeContainer start.....");while (redisBaseService.sSize("上次关闭服务记录数据的key") > 0) {String key= (String) redisBaseService.sPop("上次关闭服务记录数据的key");DelayItem delayItem = new DelayItem(key, 1, TimeUnit.MINUTES);MemoryData.delayQueue.put(delayItem);}new Thread(() -> {peakData();}).start();log.info("peakData getData start...");}@Overridepublic void destroy() {for (int i = 0; i < MemoryData.delayQueue.size(); i++) {DelayItem take;try {take = MemoryData.delayQueue.take();if (StringUtils.isNotBlank(take.getDelayKey())) {redisBaseService.sAdd("未处理完的服务记录数据的key", take.getDelayKey());}} catch (InterruptedException e) {log.info("peakData getData error", e);}}}}由于项目使用的是rabbitmq而非RocketMQ,否则使用RocketMQ的延迟消息机制会更方便,根据业务场景不同,可以使用不同的实现机制
包括不限于延迟队列,消息,定时任务等

DelayQueue使用相关推荐

  1. 【Java并发编程】20、DelayQueue实现订单的定时取消

    当订单定时取消需要修改数据库订单状态,但是怎么确定订单什么时候应该改变状态,解决方案有下面两种:  第一种,写个定时器去每分钟扫描数据库,这样更新及时,但是如果数据库数据量大的话,会对数据库造成很大的 ...

  2. java加载c库阻塞_【死磕Java並發】-----J.U.C之阻塞隊列:DelayQueue

    DelayQueue是一個支持延時獲取元素的無界阻塞隊列.里面的元素全部都是"可延期"的元素,列頭的元素是最先"到期"的元素,如果隊列里面沒有元素到期,是不能從 ...

  3. 每日一博 - DelayQueue阻塞队列源码解读

    文章目录 Pre DelayQueue特征 Leader/Followers模式 DelayQueue源码分析 类继承关系 核心方法 成员变量 构造函数 入队方法 offer(E e) 出队方法 po ...

  4. Java DelayQueue延迟队列的使用和源码分析

    文章目录 概述 示例 原理分析 概述 DelayQueue 是JAVA提供的延时队列,队列内部的对象必须实现 Delayed 接口,该接口只有一个 getDelay 方法,返回延迟执行的时长. pub ...

  5. 使用DelayQueue 和 FutureTask 实现java中的缓存

    使用DelayQueue.ConcurrentHashMap.FutureTask实现的缓存工具类. DelayQueue 简介 DelayQueue是一个支持延时获取元素的无界阻塞队列.DelayQ ...

  6. DelayQueue源码

    介绍 一个实现PriorityBlockingQueue实现延迟获取的无界队列,在创建元素时,可以指定多久才能从队列中获取当前元素.只有延时期满后才能从队列中获取元素.(DelayQueue可以运用在 ...

  7. DelayQueue详解

    一.DelayQueue是什么 DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走.这种队列是有序的,即队头对 ...

  8. java中DelayQueue的使用

    文章目录 简介 DelayQueue DelayQueue的应用 总结 java中DelayQueue的使用 简介 今天给大家介绍一下DelayQueue,DelayQueue是BlockingQue ...

  9. 阻塞队列之七:DelayQueue延时队列

    一.DelayQueue简介 是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走.这种队列是有序的(PriorityQueue实际 ...

  10. delayqueue_在DelayQueue中更改延迟,从而更改顺序

    delayqueue 因此,我正在考虑构建一个简单的对象缓存,该缓存在给定时间后会使对象过期. 显而易见的机制是使用Java并发包中的DelayedQueue类. 但是我想知道是否有可能在将对象添加到 ...

最新文章

  1. 腾讯会议又一黑科技,屏蔽超过 200 种会议噪声是如何做到的?
  2. Jquery中关于动画的一些操作函数
  3. Xamarin Andro教程搭建Xamarin Androidid开发环境(一)
  4. BFD (双向转发检测) 协议简介与开发
  5. 批量生成印刷字体字库
  6. 使用T-SQL语句操作数据表-删除数据
  7. Sightseeing Cows(POJ-3621)
  8. Linux离线的nginx安装启动,linux-离线安装nginx
  9. Windows Xp下 无法定位程序输入点WSAPoll于动态链接库ws2_32.dll 的解决办法
  10. java实现ftp文件夹增量上传下载
  11. linux安装yarn
  12. 图片加密信息(16进制)
  13. 如何快速辨别工业级POE交换机和普通交换机的不同?
  14. 在Docker中创建应用
  15. lwip --- (十六)TCP建立流程
  16. 如何实现搜索附近的店铺
  17. html缩放惯性,js带滚动惯性的视觉差特效插件
  18. 机器视觉领域的牛人们的博客
  19. iOS开发拓展篇—音效的播放
  20. 把手机变成电脑的遥控器

热门文章

  1. 在线文本加密解密工具
  2. html 一键发送给微信朋友圈,微信朋友圈如何转发别人说说(朋友圈一键集赞神器)...
  3. linux复制特定类型文件,Linux复制指定目录及子目录下特定类型的文件
  4. “没有灵魂”的AI作诗,有啥用?
  5. format mla_mlaformat是什么
  6. Padavan固件添加adbyby去广告功能
  7. java之StringBuilder和关于数组怎么扩容
  8. 微信获取粉丝信息php,1.2 微信粉丝用户及粉丝标签管理
  9. 易语言 查询API之文本和字体函数
  10. Freecad的Python脚本