首页 > 编程语言 > 详细

DelayQueue java自有延迟队列 实现单体业务定时或延迟执行

时间:2020-11-26 22:32:25      阅读:38      评论:0      收藏:0      [点我收藏+]

最近有很多业务给我们sql,我们需要一个个去配置上线,太麻烦了。我们做了一个通用单体项目给业务方,让他们自己在数据库配置sql,自己设置定时任务时间,自己去扫描执行。我们为了解析自有得一些时间配置。加入了这么个东西。主要用来实现类似定时任务一样的东西,只不过跟我们提供的交易日类型进行了个性化配置。相比xxl-job、quartz这些,更贴合我们业务。

 

其实个人理解昂,技术为业务服务,没有绝对优秀的技术,再优秀没有产生价值,对我们来说也仅仅是用来谈论的理想,而现实永远都是我们需要一点点的去实践和应用的。

 

技术分享图片

 

 

将时间分割出来,再某一小时时间区间内,捞取要执行的语句,放入延迟队列,比如19:30要执行的语句,可以在19点定时任务扫描时,放入dealy,延迟30分钟执行。

 

存储一张执行记录表。执行延时区间可配置,执行时间可配置(定时任务没参数,默认当前时间)。执行任务发起后,延迟队列放入异步线程。

 

异步线程池配置:

技术分享图片

 

 

线程池计算公式:

 

线程数量=cpu的数量*cpu期望利用率*(1 + wait time / service time)。

wait time 等待io完成时间

service time CPU忙处理任务的时间(不包含阻塞等待的时间),例如 处理io返回完成时间 

wait time / service time 称为阻塞系数,对于CPU密集型任务 阻塞系数为0,cpu核的数量就是线程数,拥有更多的线程数也是用处不大的。


比如一个8核CPU,希望这部分工作的CPU使用率20%,任务等待io完成50ms,任务执行io返回5ms。
那么线程数量=8*0.2*(1+50/5)=16

 

消费者添加@Async,变更消费者线程为异步,不阻塞定时任务执行时间。

 

执行结果:

技术分享图片

 

 

优势:

直接某一点全部放入延迟队列,系统串行,容错率太低。单一线程一直执行,系统负荷增加。

采用区间扫描容错性更强,中和性更好一点。

DelayQueue java自有延迟队列 实现单体业务定时或延迟执行

原文:https://www.cnblogs.com/wangxiaobobo/p/14044570.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!