知识大全 Timer,Quartz和Spring实现作业调度

Posted

篇首语:于今腐草无萤火,终古垂杨有暮鸦。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Timer,Quartz和Spring实现作业调度相关的知识,希望对你有一定的参考价值。

Timer,Quartz和Spring实现作业调度  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一 java util Timer

  在Java中有一个任务处理类java util Timer 非常方便于处理由时间触发的事件任务 只需建立一个继承java util TimerTask的子类 重载父类的run()方法实现具体的任务 然后调用Timer的public void schedule(TimerTask task long delay long period)方法实现任务的调度

  但是这种方法只能实现简单的任务调度 不能满足任务调度时间比较复杂的需求 比如希望系统在每周的工作日的 时向系统用户给出一个提示 这种方法实现起来就困难了 还有更为复杂的任务调度时间要求

  二 Quartz

  OpenSymphony 的Quartz提供了一个比较完美的任务调度解决方案

  Quartz 是个开源的作业调度框架 为在 Java 应用程序中进行作业调度提供了简单却强大的机制

  Quartz中有两个基本概念 作业和触发器 作业是能够调度的可执行任务 触发器提供了对作业的调度

   作业

  实现 quartz job 接口 实现接口方法 public void execute(JobExecutionContext context) throws JobExecutionException 在这个方法实现具体的作业任务

  代码例子

  java 代码

  execute 方法接受一个 JobExecutionContext 对象作为参数 这个对象提供了作业实例的运行时上下文 它提供了对调度器和触发器的访问 这两者协作来启动作业以及作业的 JobDetail 对象的执行 Quartz 通过把作业的状态放在 JobDetail 对象中并让 JobDetail 构造函数启动一个作业的实例 分离了作业的执行和作业周围的状态 JobDetail 对象储存作业的侦听器 群组 数据映射 描述以及作业的其他属性

   触发器

  触发器可以实现对任务执行的调度 Quartz 提供了几种不同的触发器 复杂程度各不相同

  简单触发器

  public void task() throws SchedulerException

  // Initiate a Schedule Factory

  SchedulerFactory schedulerFactory = new StdSchedulerFactory();

  // Retrieve a scheduler from schedule factory

  Scheduler scheduler = schedulerFactory getScheduler();

  // current time

  long ctime = System currentTimeMillis();

  // Initiate JobDetail with job name job group and executable job class

  JobDetail jobDetail =

  new JobDetail( jobDetail s jobDetailGroup s SimpleQuartzJob class);

  // Initiate SimpleTrigger with its name and group name

  SimpleTrigger simpleTrigger =

  new SimpleTrigger( simpleTrigger triggerGroup s );

  // set its start up time

  simpleTrigger setStartTime(new Date(ctime));

  // set the interval how often the job should run ( seconds here)

  simpleTrigger setRepeatInterval( );

  // set the number of execution of this job set to times

  // It will run time and exhaust

  simpleTrigger setRepeatCount( );

  // set the ending time of this job

  // We set it for seconds from its startup time here

  // Even if we set its repeat count to

  // this will stop its process after repeats as it gets it endtime by then

  // simpleTrigger setEndTime(new Date(ctime + L));

  // set priority of trigger If not set the default is

  // simpleTrigger setPriority( );

  // schedule a job with JobDetail and Trigger

  scheduler scheduleJob(jobDetail simpleTrigger);

  // start the scheduler

  scheduler start();

  

  首先实例化一个 SchedulerFactory 获得调度器 创建 JobDetail 对象时 它的构造函数要接受一个 Job 作为参数 SimpleTrigger 是一个简单的触发器 在创建对象之后 设置几个基本属性以立即调度任务 然后每 秒重复一次 直到作业被执行 次

  Cron触发器

  CronTrigger 支持比 SimpleTrigger 更具体强大的调度 实现起来却不是很复杂 CronTrigger基于 cron 表达式 支持类似日历的重复间隔更为复杂的调度时间上的要求

  Cron 表达式包括以下 个字段

  ·秒

  ·分

  ·小时

  ·月内日期

  ·月

  ·周内日期

  ·年(可选字段)

  Cron 触发器利用一系列特殊字符 如下所示

  ·反斜线(/)字符表示增量值 例如 在秒字段中 / 代表从第 秒开始 每 秒一次

  ·问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用 问号表示这个字段不包含具体值 所以 如果指定月内日期 可以在周内日期字段中插入 ? 表示周内日期值无关紧要 字母 L 字符是 last 的缩写 放在月内日期字段中 表示安排在当月最后一天执行 在周内日期字段中 如果 L 单独存在 就等于 否则代表当月内周内日期的最后一个实例 所以 L 表示安排在当月的最后一个星期日执行

  ·在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日 把 W 放在月内日期字段中 表示把执行安排在当月的第一个工作日内

  ·井号(#)字符为给定月份指定具体的工作日实例 把 MON# 放在周内日期字段中 表示把任务安排在当月的第二个星期一

  ·星号(*)字符是通配字符 表示该字段可以接受任何可能的值

  所有这些定义看起来可能有些吓人 但是只要几分钟练习之后 cron 表达式就会显得十分简单

  下面的代码显示了 CronTrigger 的一个示例 请注意 SchedulerFactory Scheduler 和 JobDetail 的实例化 与 SimpleTrigger 示例中的实例化是相同的 在这个示例中 只是修改了触发器 这里指定的 cron 表达式( / * * * * ? )安排任务每 秒执行一次

  public void task() throws SchedulerException

  // Initiate a Schedule Factory

  SchedulerFactory schedulerFactory = new StdSchedulerFactory();

  // Retrieve a scheduler from schedule factory

  Scheduler scheduler = schedulerFactory getScheduler();

  // current time

  long ctime = System currentTimeMillis();

  // Initiate JobDetail with job name job group and executable job class

  JobDetail jobDetail =

  new JobDetail( jobDetail jobDetailGroup SimpleQuartzJob class);

  // Initiate CronTrigger with its name and group name

  CronTrigger cronTrigger = new CronTrigger( cronTrigger triggerGroup );

  try

  // setup CronExpression

  CronExpression cexp = new CronExpression( / * * * * ? );

  // Assign the CronExpression to CronTrigger

  cronTrigger setCronExpression(cexp);

   catch (Exception e)

  e printStackTrace();

  

  // schedule a job with JobDetail and Trigger

  scheduler scheduleJob(jobDetail cronTrigger);

  // start the scheduler

  scheduler start();

  

  三 Spring + Quartz

  spring对Java的Timer类和Quartz都提供了一个抽象层 使用我们可以更方便地使用它们

   spring与Timer的集成

  首先是一个定时器任务

  public class EmailReportTask extends TimerTask

  public EmailReportTask()

  

  public void run()

  courseService sendCourseEnrollmentReport();

  

  private CourseService courseService;

  public void setCourseService(CourseService courseService)

  urseService = courseService;

  

  

  spring配置文件中配置EmailReportTask

   <bean id= reportTimerTask

        class= springinaction training schedule EmailReportTask >

             <property name= courseService >

             <ref bean= courseService />

        </property>

   </bean>

  调度定时器任务

  xml 代码

   <bean id= scheduledReportTask

  

             class= springframework scheduling timer ScheduledTimerTask >

  

  

             <property name= timerTask >

  

                   <ref bean= reportTimerTask />

  

             property>

  

             <property name= period >

  

                   <value> <value>

  

  

             property>

  

             <property name= delay >

  

                   <value> value>

  

             property>

  

   bean>

  

  启动定时器

  xml 代码

   <bean class= springframework scheduling timer TimerFactoryBean >

         <property name= scheduledTimerTasks >

               <list>

                     <ref bean= scheduledReportTask />

               list>

         property>

   bean>

   spring与Quartz的集成

  创建一个工作

   public class EmailReportJob extends QuartzJobBean

  

       public EmailReportJob()

  

       

  

       protected void executeInternal(JobExecutionContext context)  throws JobExecutionException

            courseService sendCourseEnrollmentReport();

       

  

       private CourseService courseService;

       public void setCourseService(CourseService courseService)

           urseService = courseService;

       

  

  在spring配置文件的配置EmailReportJob

   <bean id= reportJob

         class= springframework scheduling quartz JobDetailBean >

         <property name= jobClass >

              <value> springinaction training schedule EmailReportJobvalue>

         property>

         <property name= jobDataAsMap >

              <map>

                   <entry key= courseService >

                        <ref bean= courseService />

                   entry>

              map>

         property>

   bean>

  调度工作

  和quartz对应 Spirng提供了两个触发器SimpleTriggerBean和CronTriggerBean

  使用SimpleTriggerBean触发器

   <bean id= simpleReportTrigger

        class= springframework scheduling quartz SimpleTriggerBean >

        <property name= jobDetail >

             <ref bean= reportJob />

        property>

        <property name= startDelay >

             <value> value>

        property>

        <property name= repeatInterval >

             <value> value>

        property>

   bean>

  使用CronTriggerBean触发器

   <bean id= cronReportTrigger

             class= springframework scheduling quartz CronTriggerBean >

        <property name= jobDetail >

             <ref bean= reportJob />

        property>

        <property name= cronExpression >

             <value> * * * * ?value>

        property>

   bean>

cha138/Article/program/Java/hx/201311/27082

相关参考

知识大全 浅谈spring时序调度Quartz

浅谈spring时序调度Quartz  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  近期接到一个

知识大全 Spring中Quartz的配置

Spring中Quartz的配置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Quartz是一

知识大全 Quartz调度框架应用总结

Quartz调度框架应用总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前一段时间项目需要做

知识大全 Spring整合Quartz定时发送邮件

Spring整合Quartz定时发送邮件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  功能描述

知识大全 Spring集成Quartz的XML配置

Spring集成Quartz的XML配置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  <

知识大全 Spring与自动调度任务

Spring与自动调度任务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  最近把以前设想做搜索引

作业组向电力调度申请停电作业命令时应注意哪些事项?

  应注意事项:  每个作业组在停电作业前由工作领导人或指定1名安全等及不低于3级的作业组成员作为要令人员,按工作票内容向电力调度说明停电作业范围、内容,时间和安全措施等。  几个作业组同时作业时,每

作业组向电力调度申请停电作业命令时应注意哪些事项?

  应注意事项:  每个作业组在停电作业前由工作领导人或指定1名安全等及不低于3级的作业组成员作为要令人员,按工作票内容向电力调度说明停电作业范围、内容,时间和安全措施等。  几个作业组同时作业时,每

电力调度员下达停电作业命令时应注意什么?

  电力调度员发布停电作业命令时,受令人要认真复诵,经确认无误后,方可给予命令编号和批准时间。

电力调度员下达停电作业命令时应注意什么?

  电力调度员发布停电作业命令时,受令人要认真复诵,经确认无误后,方可给予命令编号和批准时间。