最近有很多业务给我们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