您的位置:首页 > 其它

定时组件的实现

2016-02-26 12:54 405 查看
日历定时组件的使用:

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)

是关键的核心.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: