abpvnext后台工作者使用quartz扩展的一些思路和使用细节记录--(未完待续)

需求背景描述:

我有一个温湿度数据采集的物联网系统,每个租户都需要定时执行若干种任务, 不同的租户, 他定时执行的间隔不一样 ,比如 

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日记录:

因为前端时间被老项目任务拖累,一直到现在才有空重新回来做这个没做完的定时任务逻辑。重新回顾了一下5-13日的问题, 给job表增加 下次执行时间  字段可以解决问题,这样只用在每次遍历job表的时候任务的下次执行时间是否已经到达了,当前时间到达或超过下次执行时间都可以执行,每次执行完一行作业任务,就把下次执行时间加上执行间隔,更新为新的下次执行时间。  不过这样要考虑业务配置的执行间隔不能比quartz工作者本身的执行间隔还短,不然永远都追不上任务下一次的执行时间,会越拉越长,比如quartz工作者本身是20秒执行一次, 那所有的job任务执行间隔应该要超过20秒。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值