问题的提出
Xxl-job的执行器本身是无法获取到job的本次触发时间与下次触发时间这两个信息的。这两个时间信息在业务上有什么用处没有?答案是仁者见仁,智者见智。对于我们公司的业务来说,这两个信息具有实际意义。
打个比方来说。当每次job执行时,我想要获取job上次触发时间和本次触发时间。以这两个时间为一个时间段探测在这段时间内是否有报警记录。那么job的执行时间对我而言是有实际意义的。
问题的解决
既然xxl-job没有现成的解决方案。我们改如何改动下从而解决这个问题呢?
线索获取:登录调度中心。获取任务信息。
后台服务路径:
/xxl-job-admin/jobinfo/pageList
可以从后台服务路径中看到:
XxlJobInfo这个对象。
分析下这个对象的内容:
public class XxlJobInfo {
...
private long triggerLastTime; // 上次调度时间
private long triggerNextTime; // 下次调度时间
...
}
我们看到在job信息里面是存在这个调度时间的。
我们要做的是什么?那就探讨下在调度器与执行器之间XxlJobInfo对象是如何传递的。
下面我们将通过分析调度控制器页面【执行一次】按钮:
我们跟踪下代码:
/xxl-job-admin/jobinfo/trigger
我们在触发任务的时候会从DB获取job数据配置信息。其中包含了我们要用到的上次调度时间,下次调度时间。
在触发器参数里的原始的代码中是没有把我们需要的上次执行时间,下次执行时间放入的。这是我们需要改造的点。
最终TriggerParam交由执行器。
执行器捕获了参数,从参数中可以获取jobInfo的上次执行时间,下次执行时间。那又是如何获取的呢?
可以看到执行器这边将TriggerParam放到了任务线程的任务队列里面。
具体执行job的线程则从触发队列里面获取到triggerParam。
而每个job都有自己的XxlJobContext,从而最终从调度中心来的参数可以通过这个对象获取。
我们自己的业务代码可以通过上下文对象获取job本次执行时间以及下次执行时间。利用这个代码。解决了我们的需求。
问题的总结
解决以上问题。首先的思路就是找到xxljob本身是否存在我们要用到的信息。我们发现其实xxljob本身是有对应的信息的。只是默认不提供,通过跟踪源代码,我们获得了关键参数对象【TriggerParam】。通过改造【TriggerParam】我们成功的获取到了我们要用到的信息。
所以需要大家自己多阅读源码,跟踪老师们的步伐找到有用的信息。