需求背景描述:
我有一个温湿度数据采集的物联网系统,每个租户都需要定时执行若干种任务, 不同的租户, 他定时执行的间隔不一样 ,比如
A租户,数据保存间隔60秒,数据是否超限的轮询间隔是是600秒,
B租户,数据保存间隔是300秒,数据是否超限的轮询间隔是1800秒。
经过查阅abp官网文档,和quartz资料,得到如下思路:
1、用quartz来排队执行后台工作者,需要一个job执行队列表。
2、搞一个定时任务,最简单的比如timer,然后定时去获取所有租户的定时任务间隔时间,看看是否有修改,有修改就按照新的定时任务轮询间隔,给job表按租户更新新的执行队列行。
3、然后quartz就不停的排队定时去job执行对列表中领取任务执行。
具体执行思路如下:
1、定义 一个job队列表,包含字段:
任务id,租户id,执行的业务类型(按setinfo表对应的设置字段名来填,也可以理解为任务组别),任务名称,执行时间间隔,开始执行时间,停止执行时间,上次执行时间,下次执行时间,执行次数(可选),失败次数(可选),执行状态锁(1执行中,0空闲中),任务状态(0,停止,1启动)。
job队列表以租户和执行的业务类型2个字段来判断唯一值,每个租户同一个执行类型只允许有一行数据。
比如租户A,执行类型offline ,执行周期60秒
租户B,执行类型savetime,执行周期1800秒
2、搞一个普通的后台工作者,比如定时1分钟去扫描一次setinfo表,然后遍历分析看看每个租户的各项需要执行的判定周期是否有变动,如果有变动就到job队列表,新增或者修改这个租户对应的执行业务类型的周期值。
3、搞个quartz后台工作者,定期调用业务执行类PeriodicJudgmentService类的PeriodicJudgmentData方法,这个方法业务为:
读取job队列表数据,遍历所有job数据行,
如果当前时间和job行上次执行时间的差是大于job的执行时间间隔列的值(2023-6-1新思路修改为用下一次执行时间来与当前时间比较,当前时间大于下次执行时间就执行一次),我们就需要根据租户ID查询到setinfo、tmplist、descList信息装填到定义的变量,做好数据准备。
然后根据job的类型,将上面准备好的数据变量做参数传递,去调用执行指定的业务逻辑方法,比如离线判断一个方法,数据超限判断一个方法,数据保存一个方法。
4、其实还可以根据job的执行类型,来分别建立quartz后台工作者,
比如离线判断一个工作者,数据超限判断一个工作者,数据保存一个工作者,这样可能不同业务分开执行,能更好的隔离各任务类型,并且确保不同的业务类型的执行安全程度。
2023-5-13日临时思考记录:
每个任务类型的执行队列,那么多行,怎么判断是否执行完成了一轮是个问题,是否需要在队列表中加执行顺序。或者是否要考虑再加一个任务执行记录表,记录执行了哪些任务。
2023-6-1日记录:文章来源:https://www.toymoban.com/news/detail-440890.html
因为前端时间被老项目任务拖累,一直到现在才有空重新回来做这个没做完的定时任务逻辑。重新回顾了一下5-13日的问题, 给job表增加 下次执行时间 字段可以解决问题,这样只用在每次遍历job表的时候任务的下次执行时间是否已经到达了,当前时间到达或超过下次执行时间都可以执行,每次执行完一行作业任务,就把下次执行时间加上执行间隔,更新为新的下次执行时间。 不过这样要考虑业务配置的执行间隔不能比quartz工作者本身的执行间隔还短,不然永远都追不上任务下一次的执行时间,会越拉越长,比如quartz工作者本身是20秒执行一次, 那所有的job任务执行间隔应该要超过20秒。文章来源地址https://www.toymoban.com/news/detail-440890.html
到了这里,关于abpvnext后台工作者使用quartz扩展的一些思路和使用细节记录--(未完待续)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!