日历定时组件的使用:
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类里实现):
- 如果错过时间在50秒内则不算错过触发时间, 继续执行.
- 如果没有下一次触发时间了, 马上触发.
- 如果错过的时间小于2分钟, 马上触发.
- 如果错过的时间大于2分钟, 但是离下一次触发的时间大于5分钟, 马上触发.
- 其他情况使用下一次触发时间.
4.触发器在每一次触发之前还需要计算下一次触发时间,
更新上一次触发时间, 更新触发次数.(在Trigger类里实现).
5. 任务调度流程图:
任务调度监控器(richinfo.bcomponet.tasks.scheduler.core.JobSchedulerMonitor)
是关键的核心.