定时组件的实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了定时组件的实现相关的知识,希望对你有一定的参考价值。

日历定时组件的使用:

1、在web.xml添加监听

 <listener>
    <listener-class>richinfo.calendar.util.TasksSystemListener</listener-class>
  </listener>

2、增加task.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <tasks>
 3      <task name="CalendarWaitThread" class="richinfo.calendar.service.CalendarWaitThread">
 4         <desc>日程定时器待下发服务(24小时)</desc>
 5      </task>
 6      <task name="CalendarThread" class="richinfo.calendar.service.CalendarThread">
 7         <desc>日程定时器下发服务(1分钟)</desc>
 8      </task>
 9     <task name="SendSubLabelMsg" class="richinfo.calendar.service.SubcribeCalendarThread">
10         <desc>日程定时器下发服务(1分钟)</desc>
11      </task>
12      <task name="SendEmailSms" class="richinfo.calendar.service.CalendarEmailSmsSendThread">
13         <desc>待办任务短信下发</desc>
14      </task>
15      <task name="CalendarEmailSmsWaitThread" class="richinfo.calendar.service.CalendarEmailSmsWaitMsgThread">
16         <desc>待办任务短信扫描</desc>
17      </task>
18      <!--  
19      <task name="ScanningLabelThead" class="richinfo.calendar.service.CalendarScanningLabelThead">
20         <desc>定时扫描日历信息表</desc>
21      </task>
22      -->
23      <task name="CalendarDailyRemindThread" class="richinfo.calendar.service.CalendarDailyRemindThread">
24         <desc>每日邮件见扫描(24小时)</desc>
25      </task>
26    <timer>
27         <!-- 每天凌晨2点执行 -->
28         <cron>0 15,7 * * *</cron>
29         <task-ref ref="CalendarWaitThread" />
30     </timer>
31     <timer>
32         <!-- 每天4.7点执行 -->
33         <cron>0 12,13 * * *</cron>
34         <task-ref ref="CalendarEmailSmsWaitThread" />
35     </timer>
36     <timer>
37         <!-- 每隔1分钟执行 -->
38         <delay>5m</delay>
39         <repeat-interval>1m</repeat-interval>
40         <task-ref ref="CalendarThread" />
41     </timer>
42     <timer>
43         <!-- 每隔1分钟执行 -->
44         <delay>5m</delay>
45         <repeat-interval>1m</repeat-interval>
46         <task-ref ref="SendSubLabelMsg" />
47     </timer>
48     <timer>
49         <!-- 每隔1分钟执行 -->
50         <delay>5m</delay>
51         <repeat-interval>1m</repeat-interval>
52         <task-ref ref="SendEmailSms" />
53     </timer>
54      <!--  
55    <timer>
56         <delay>5m</delay>
57         <repeat-interval>1m</repeat-interval>
58         <task-ref ref="ScanningLabelThead" />
59     </timer>
60     -->
61     <timer>
62         <!-- 每天凌晨2点执行 -->
63         <cron>0 4,7 * * *</cron>
64         <task-ref ref="CalendarDailyRemindThread" />
65     </timer>
66 </tasks>

3、实现类

richinfo.calendar.service.CalendarWaitThread

richinfo.calendar.service.CalendarThread

richinfo.calendar.service.SubcribeCalendarThread

这些个方法实现了init,repeat方法

java有自己的定时任务处理的类,而室内的定时组件复用了Quartz

 

定时组件的原理如下:

 

 

定时器模块整体处理模型:

 

技术分享

 

定时器模块中最重要的是任务调度监控器(JobSchedulerMonitor)

它会定时去JobStore查看已经到点要触发的触发器,

得到之后再使用JobExecutor运行对应的任务.

1.Trigger通过实现Comparable接口实现Trigger之间的排序功能,

排序因素主要有: 下一次触发时间和任务优先级.

2.等待调度的Trigger是保存在TreeSet里面的, 会自动完成排序,

也就是TreeSet里面第一个Trigger肯定是最近需要触发的触发器.

3.触发器在每一次触发之前都需要判断是否错过了触发时间,

如果错过了则需要考虑策略问题(是马上触发还是使用下一次触发).

当前实现的策略是(在Trigger类里实现):

  1. 如果错过时间在50秒内则不算错过触发时间, 继续执行.
  2. 如果没有下一次触发时间了, 马上触发.
  3. 如果错过的时间小于2分钟, 马上触发.
  4. 如果错过的时间大于2分钟, 但是离下一次触发的时间大于5分钟, 马上触发.
  5. 其他情况使用下一次触发时间.

    4.触发器在每一次触发之前还需要计算下一次触发时间,

更新上一次触发时间, 更新触发次数.(在Trigger类里实现).

 

5. 任务调度流程图:

任务调度监控器(richinfo.bcomponet.tasks.scheduler.core.JobSchedulerMonitor)

是关键的核心.

技术分享

 

以上是关于定时组件的实现的主要内容,如果未能解决你的问题,请参考以下文章

分布式定时任务调度框架 - Quartz学习及实战记录笔记

分布式定时任务调度框架 - Quartz学习及实战记录笔记

一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI

一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI

.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度

使用quartz.jar quartz-jobs.jar 实现定时任务 。实现 定时采集 接口数据