前一篇博客介绍了不同定时器的使用的业务背景,下面是针对我们公司的需求情况我的实际技术选型过程:
原始需求:每天早上7:00到晚上7:00,每间隔2小时内执行任务
技术抽象:每天的从固定时间开始一个任务,在固定的时间结束一个任务,并且在这段时间期间,在一定的时间间隔内重复这个任务.
技术选型:我画了一个流程图,是我自己的理解,可能不全面欢迎指出:
正在沾沾自喜觉得发现解决方案的时候,新的需求来了:
原始需求:不同的生产线的开工时间和结束时间t以及时间间隔i不同.
技术分析::不同的任务类型读取不同的时间间隔i和时间刻t变量..也就是说,在上图中分析的t和i虽然是变量的配置,但是是一个全局配置变量,现在的要求是是一个局域变量.换而言之,也就相当于,现在每个任务类型开启不同的线程,每个线程都有一套不同的规则....
代码层次分析:
也就是开始是把定时参数(开始时间,时间间隔,结束时间)从配置表中读出来,然后,把定时任务放在这个定时规则之内.(startTime/endTime/和interval是全局变量)
现在,不得不先根据不同的定时任务,按产线的,调用定时任务,(startTime/endTime/和interval是局域变量)
我想到的初步方案是:按着不同的产线产生不同的线程,每个线程用自己的一套变量.
缺点:每个车间的产线不同,多了一层嵌套循环,而且在此基础上加上多线程的定时器的嵌套.系统性能会大大的降低.
最终的解决方案:
想到大学时候哲学课的时候老师给展示的一个图片,大道至简.后来和同事讨论后的最终结果是:所有的生产线放到一个列表中,建立一个表格来维护每个产线的上次执行时间和时间间隔.用一个时间间隔的定时器轮训所有的列表中的生产线,只要满足:上次执行时间+时间间隔>=系统时间,则执行改任务.
特点:这种解决方式,不是很精确,会有误差.但是基于现实需求是,每次的时间间隔是2h或者4h或者8h.而我们定时器的轮训时间间隔是10分钟一次,所以足以忽略的满足所有的要求.