目前有一个方案表, 方案表里面有一个开始时间和一个结束时间,时间的格式为 HH:MM,当服务器时间的和方案表里面的开始时间相同时 去执行一个命令,然后当服务器时间和结束时间一样时,再执行一个操作。服务器启动的时候就得去判断是否要执行操作。
一开始我用的是spring quartz,然后总监说这么实现不好,求牛人给想个办法。
------解决方案--------------------
服务器压力大不是quartz的错,你们的业务是定时执行,不管用什么定时都会有很大的压力。
quartz不存在不准时的问题。
你领会错了领导的意思吧,要不就是你的业务场景还有其他的特点你没有描述出来
------解决方案--------------------
定时器做确实不合适,定时器是在已经知道什么时候要执行的情况下去触发的。什么时候时间一致是不确实的。
建议用长连接,然后开个线程去监控。
------解决方案--------------------
那10楼的方案如何?项目启动时跑个线程,获取系统时间。然后结合观察者模式,到指定的时间点时,进行相应的处理
嗯,这只是我的一个思路,具体的技术实现我也不确定,以我的水准也只能咔咔的找资料之类的。不过我觉得应该可行……
------解决方案--------------------
我也不想这么纠结的触发,需求就这么摆着没有办法了。。
触发的任务的时间逻辑不确定是么,这一点quartz确实没办法满足你的需求,你可以尝试自己写一个定时任务框架,如果你一定要用这么纠结的时间触发逻辑的话
那你就自己写一个定时框架啊,很简单的。
起一个守护线程,检查你的触发逻辑,维护一个线程池,触发之后把任务丢进线程池里跑就好了。
其他功能可以仿造quartz定制
------解决方案--------------------
项目启动时, 创建一个多线程池, 主线程监控方案时间和系统时间是否相同, 如果相同,并发执行所有方案的子线程,执行结束后, 使用 Future 返回 callAble() 的执行结果, 如果单个的 callAble 返回的结果与系统时间相同, 则关闭这个子线程, 重新开启另一个执行操作。 依次类推, 假设执行每个方案的业务逻辑相同,并行触发每个子线程,代码还是比较好写的,如果业务逻辑代码不同,那就比较麻烦了。