定时组件的实现
2016-02-26 12:54
405 查看
日历定时组件的使用:
1、在web.xml添加监听
2、增加task.xml
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)
是关键的核心.
1、在web.xml添加监听
<listener> <listener-class>richinfo.calendar.util.TasksSystemListener</listener-class> </listener>
2、增加task.xml
<?xml version="1.0" encoding="UTF-8"?> <tasks> <task name="CalendarWaitThread" class="richinfo.calendar.service.CalendarWaitThread"> <desc>日程定时器待下发服务(24小时)</desc> </task> <task name="CalendarThread" class="richinfo.calendar.service.CalendarThread"> <desc>日程定时器下发服务(1分钟)</desc> </task> <task name="SendSubLabelMsg" class="richinfo.calendar.service.SubcribeCalendarThread"> <desc>日程定时器下发服务(1分钟)</desc> </task> <task name="SendEmailSms" class="richinfo.calendar.service.CalendarEmailSmsSendThread"> <desc>待办任务短信下发</desc> </task> <task name="CalendarEmailSmsWaitThread" class="richinfo.calendar.service.CalendarEmailSmsWaitMsgThread"> <desc>待办任务短信扫描</desc> </task> <!-- <task name="ScanningLabelThead" class="richinfo.calendar.service.CalendarScanningLabelThead"> <desc>定时扫描日历信息表</desc> </task> --> <task name="CalendarDailyRemindThread" class="richinfo.calendar.service.CalendarDailyRemindThread"> <desc>每日邮件见扫描(24小时)</desc> </task> <timer> <!-- 每天凌晨2点执行 --> <cron>0 15,7 * * *</cron> <task-ref ref="CalendarWaitThread" /> </timer> <timer> <!-- 每天4.7点执行 --> <cron>0 12,13 * * *</cron> <task-ref ref="CalendarEmailSmsWaitThread" /> </timer> <timer> <!-- 每隔1分钟执行 --> <delay>5m</delay> <repeat-interval>1m</repeat-interval> <task-ref ref="CalendarThread" /> </timer> <timer> <!-- 每隔1分钟执行 --> <delay>5m</delay> <repeat-interval>1m</repeat-interval> <task-ref ref="SendSubLabelMsg" /> </timer> <timer> <!-- 每隔1分钟执行 --> <delay>5m</delay> <repeat-interval>1m</repeat-interval> <task-ref ref="SendEmailSms" /> </timer> <!-- <timer> <delay>5m</delay> <repeat-interval>1m</repeat-interval> <task-ref ref="ScanningLabelThead" /> </timer> --> <timer> <!-- 每天凌晨2点执行 --> <cron>0 4,7 * * *</cron> <task-ref ref="CalendarDailyRemindThread" /> </timer> </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)
是关键的核心.
相关文章推荐
- Loading data for Android 5.0
- 鸟哥的Linux私房菜(服务器)- 主机基本安全之二: Linux线上自动升級
- pip被墙,修改国内源方法
- 闭包学习笔记
- TOP 10开源的推荐系统简介
- [Locked] Inorder Successor in BST
- 拉格朗日对偶
- XSS测试平台
- 鸟哥的Linux私房菜(服务器)- 主机基本安全之一:限制 Linux 对外连线的端口
- UVA Help is needed for Dexter 11384 (递归)
- JTable隐藏指定列
- android调用c/c++基本步骤
- 服务器监控之zabbix-agent安装篇
- Hash表
- C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析
- 关于12行代码崩掉浏览器的实测
- 鸟哥的Linux私房菜(服务器)- 架站文件習題解答篇
- 设计模式(7)--责任链模式
- Android include标签 放置的顺序问题
- IOS Apps 开发(Swift)(6)——Implement a Custom Control(1)