定时组件的实现

日历定时组件的使用:

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)

是关键的核心.

时间: 2024-12-16 03:15:00

定时组件的实现的相关文章

自定义定时组件

工作了这么久,封装过一部分Helper,也写过一些控件,但也没写过属于自己的框架,这次写的这个我觉得是一个组件而已,是一个定时组件.是一个定时器组件,有别于.NET Framework里面提供的几个Timer.首先说说背景,就发现现在手头上的工作离不开定时,定时做一个任务,什么都是定时去做什么什么,隔某段时间干某件事情,都离不开“定时”这个词.众所周知这个要用到多线程,在多篇关于多线程的文章里面有提过做一些周期性的操作时最好用Timer,当然这个Timer肯定是Threading.Timer,并

定时组件quartz系列&lt;三&gt;quartz调度机制调研及源码分析

quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的java任务调度框架,功能强大配置灵活.在企业应用中占重要地位.quratz在集群环境中的使用方式是每个企业级系统都要考虑的问题.早在2006年,在ITeye上就有一篇关于quratz集群方案的讨论:http://www.iteye.com/topic/40970 ITeye创始人@Robbin在8楼

定时组件quartz系列&lt;二&gt;quartz的集群原理

1.基本信息: Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它 来为执行一个作业而创建简单的或复杂的调度.它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron- like表达式等等.其中集群配置一般比较复杂,那么在Quartz中如何配置它的集群特性呢? 2 Quartz的集群配置:      2.1 实现集群的基本原理           Quartz是通过

Navi.Component.工作流开发手册(含示例)

1.概述 1.1简介 本文档旨在帮助开发人员快速使用工作流组件,完成OA或审批等涉及到工作流组件的系统开发工作 1.2组件构成 1.2.1组件层次图 组件的核心是工作流引擎,它负责存储工作流模板.引擎被服务所包围,也就是说,若用到工作流引擎操作,必须通过工作流服务 工作流服务包含几大部分:模板服务,流程实例服务,查询服务,跟踪服务,持久化服务,定时服务等 1.2.2与宿主关系图 宿主通过工作流服务提供的各种命令操作,来完成想要实现的功能.如发起模板,流转实例等 同时,工作流服务会反馈信息给宿主,

C#中委托的进一步理解

文章介绍了委托的基本知识,接下来就进一步研究一下委托. 委托类型 其实,刚开始觉得委托类型是一个比较难理解的概念,怎么也不觉得下面的"AssembleIphoneHandler"是一个类型. 代码如下: public delegate void AssembleIphoneHandler(); 按照正常的情况,如果我们要创建一个委托类型应该是: 代码如下: public class AssembleIphoneHandler : System.MulticastDelegate { }

Spring Boot整合MyBatis学习总结

公司的很多项目都陆陆续续引入了Spring Boot,通过对Spring Boot的接触了解发现其真的是大大地简化了开发.简化了依赖配置,很多功能注解一下就可以实现,真的是太方便了.下面记录了一个Spring Boot的入门程序实现. 1,pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&qu

Shiro在Spring session管理

会话管理 在shiro里面可以发现所有的用户的会话信息都会由Shiro来进行控制,那么也就是说只要是与用户有关的一切的处理信息操作都可以通过Shiro取得,实际上可以取得的信息可以有用户名.主机名称等等,这所有的信息都可以通过Subject接口取得. System.out.println("SESSION ID = " + SecurityUtils.getSubject().getSession().getId()); System.out.println("用户名:&qu

微服务中定时任务的实现!

在springboot+springcloud中有些任务需要使用定时处理. 因为在sping家族中已经集成了定时任务类. 1. 可以在启动类上添加@EnableScheduling注解发现定时组件. 2. 在需要使用定时任务的类中,使用@Component将类添加到spring容器中. 3. 在需要添加定时任务的方法上添加定时执行注解 @Scheduled(cron = "0/30 * * * * ?")此注解后参数未cron表达式,具体需要哪些参数可以在百度中自己生成表达式   原文

基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度

在之前的文章<推荐一个简单.轻量.功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler>和<简单.轻量.功能非常强大的C#/ASP.NET定时调度任务执行管理组件–FluentScheduler之实例篇>中,我们认识和了解了FluentScheduler这款轻量的定时任务调度执行组件.今天再给大家介绍一款关于定时任务调度执行的组件–Quartz.NET,Quartz.Net是Java版Quartz的.NET实现. 相对FluentSchedule