`
Jameslyy
  • 浏览: 384995 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Timer, Quartz 和 Spring 实现作业调度

阅读更多

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

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

二、Quartz
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

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

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

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


1、作业

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

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

 

2、触发器

      触发器可以实现对任务执行的调度。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-s1", "jobDetailGroup-s1", SimpleQuartzJob.class);
        // Initiate SimpleTrigger with its name and group name
        SimpleTrigger simpleTrigger =
          new SimpleTrigger("simpleTrigger", "triggerGroup-s1");
        // set its start up time
        simpleTrigger.setStartTime(new Date(ctime));
        // set the interval, how often the job should run (10 seconds here)
        simpleTrigger.setRepeatInterval(10000);
        // set the number of execution of this job, set to 10 times.
        // It will run 10 time and exhaust.
        simpleTrigger.setRepeatCount(100);
        // set the ending time of this job.
        // We set it for 60 seconds from its startup time here
        // Even if we set its repeat count to 10,
        // this will stop its process after 6 repeats as it gets it endtime by then.
        // simpleTrigger.setEndTime(new Date(ctime + 60000L));
        // set priority of trigger. If not set, the default is 5
        // simpleTrigger.setPriority(10);
        // schedule a job with JobDetail and Trigger
        scheduler.scheduleJob(jobDetail, simpleTrigger);
       
        // start the scheduler
        scheduler.start();
	}

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

      Cron触发器

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

      Cron 表达式包括以下 7 个字段:

  • 小时
  • 月内日期
  • 周内日期
  • 年(可选字段)

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

  • 反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。
    <!--[endif]-->
  • 问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。
    <!--[endif]-->
  • 在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。
    <!--[endif]-->
  • 井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。
    <!--[endif]-->
  • 星号(*)字符是通配字符,表示该字段可以接受任何可能的值。

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

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

 

三、Spring + Quartz

springJavaTimer类和Quartz都提供了一个抽象层,使用我们可以更方便地使用它们。

1springTimer的集成

首先是一个定时器任务

public class EmailReportTask extends TimerTask {

    public EmailReportTask() {

   

    }

 

    public void run() {

        courseService.sendCourseEnrollmentReport();

    }

 

    private CourseService courseService;

    public void setCourseService(CourseService courseService) {

        this.courseService = courseService;

    }

}

spring配置文件中配置EmailReportTask

 

<bean id="reportTimerTask"    

           class="com.springinaction.training.schedule.EmailReportTask">   

       <property name="courseService">          

              <ref bean="courseService"/>       

       </property>    

</bean>   

 

调度定时器任务

       <bean id="scheduledReportTask"    

               class="org.springframework.scheduling.timer.ScheduledTimerTask">    

           <property name="timerTask">      

                     <ref bean="reportTimerTask"/>    

           </property>

           <property name="period">      

                     <value>86400000</value>    

           </property>

              <property name="delay">      

                     <value>32000</value>      

           </property>    

       </bean>   

 

启动定时器

       <bean class="org.springframework.scheduling.timer.TimerFactoryBean"> 

           <property name="scheduledTimerTasks"> 

               <list>    

                   <ref bean="scheduledReportTask"/>                         

               </list>   

           </property> 

       </bean>    

      

2springQuartz的集成

 

创建一个工作

       public class EmailReportJob extends QuartzJobBean { 

            public EmailReportJob() {  

        

           }  

           protected void executeInternal(JobExecutionContext context)  throws JobExecutionException {  

               courseService.sendCourseEnrollmentReport();  

           }  

        

           private CourseService courseService;  

           public void setCourseService(CourseService courseService) {  

               this.courseService = courseService;  

           }  

       } 

      

spring配置文件的配置EmailReportJob

       <bean id="reportJob" 

             class="org.springframework.scheduling.quartz.JobDetailBean"> 

           <property name="jobClass"> 

               <value>com.springinaction.training.schedule.EmailReportJob</value> 

           </property> 

           <property name="jobDataAsMap"> 

               <map> 

                   <entry key="courseService"> 

                       <ref bean="courseService" /> 

                   </entry> 

               </map> 

           </property> 

       </bean> 

 

调度工作

       quartz对应,Spirng提供了两个触发器SimpleTriggerBeanCronTriggerBean

    使用SimpleTriggerBean触发器

 

       <bean id="simpleReportTrigger" 

                     class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 

           <property name="jobDetail"> 

               <ref bean="reportJob"/> 

           </property> 

           <property name="startDelay"> 

               <value>3600000</value> 

           </property> 

           <property name="repeatInterval"> 

               <value>86400000</value> 

           </property> 

       </bean> 

 

使用CronTriggerBean触发器

       <bean id="cronReportTrigger" 

               class="org.springframework.scheduling.quartz.CronTriggerBean"> 

           <property name="jobDetail"> 

               <ref bean="reportJob" /> 

           </property> 

           <property name="cronExpression"> 

               <value>0 * * * * ?</value> 

           </property> 

       </bean> 

统会在每分钟的0秒执行调度任务。

 

参考

 http://www.ibm.com/developerworks/cn/java/j-quartz/

Spring in Action

 

分享到:
评论
3 楼 sasfy 2007-10-16  
很不错,歇息
2 楼 Jameslyy 2007-08-29  
发这篇东西,弄的手抽筋,主要是格式的问题,再修改的时候文字的格式有时候会乱掉,xml代码的会丢失一些符号,弄了很多次,想追求完美,结果就是这个样子了,看样子,发文章也要好好学学啊!
1 楼 sech 2007-08-24  
呵呵,谢谢分享
学习!

相关推荐

    spring timer、quartz俩种任务调度

    实现了spring配置比较流行的任务调度操作,java timer 和 quartz俩种方式 并且有注释描述。

    Java关于时间调度的几种实现方(Timer Quartz Spring)

    Java关于时间调度的几种实现方(Timer TimerTask Quartz Spring)

    运用Spring框架实现简单调度

    如quartz、jcrontab、JobServer等,在这里我介绍一种比较简单的调度,没有quartz那么复杂,目的在于实用就行,这种调度就是spring提供的调度功能,该调度功能基于quartz+AOP进行实现,我们开始一个例子吧。

    任务调度开源框架Quartz动态添加、修改和删除定时任务

    Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业...

    spring任务调度实例

    关于spring调度的例子;| 两种方法:quartz 和 timer;| 适合学习;| 已经调试通过

    Quartz_Job+Scheduling_Framework

    Quartz 是什么,大概不需多加说明,简单讲就是一个纯 Java 实现的作业调度工具,相当于数据库中的 Job、Windows 的计划 任务、 Unix/Linux 下的 Cron ,但 Quartz 可以把排程控制的更精细。也许大多数人听说 Quartz ...

    Spring Boot中的@Scheduled注解:定时任务的原理与实现

    这个注解主要基于Java的内置Timer类以及Quartz等定时任务库,但在Spring Boot中,它提供了更加简洁和易用的方式来实现定时任务。 # 实现原理 @Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当...

    java是使用timer调度的例子

    java中用timer调度,像spring提供的Quartz一样,这里是自己调用java API中的timer写的,忘下载者给与评价

    Spring+3.x企业应用开发实战光盘源码(全)

     第13章:本章重点对在Spring中如何使用Quartz进行任务调度进行了讲解,同时还涉及了使用JDK Timer和JDK 5.0执行器的知识。  第14章:介绍Spring 3.0新增的OXM模块,同时对XML技术进行了整体的了解。  第15章:对...

    spring4.1核心包

    这个jar文件包含支持缓存Cache(ehcache)、JCA、JMX、邮件服务(Java Mail、COS Mail)、任务计划Scheduling(Timer、Quartz)方面的类。 UI方面的用来与模板(Templating)引擎如 Velocity、FreeMarker、...

    Spring排程(Scheduling)技术

    Spring排程(Scheduling)技术 1、排程(Scheduling)原理 2、什么是Timer 1)、执行一次 2)、周期执行 3、在spring中使用Timer 4、在spring中使用Quartz调度器

    SPRING 定时器的使用

    并非应用系统中发生的所有事情都是由用户的动作引起的。...在Spring中有两种流行配置:Java的Timer类和OpenSymphony的Quartz来执行调度任务。下面以给商丘做的接口集抄900到中间库的日冻结数据传输为例:

    spring in action英文版

     7.3.1 使用Java Timer调度任务  7.3.2 使用Quartz调度器  7.3.3 按调度计划调用方法  7.4 使用JMS发送消息  7.4.1 使用JMS模板发送消息  7.4.2 消费消息  7.4.3 转换消息  7.5 小结 第三...

    Spring集成Quartz定时任务框架介绍.docx

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等...使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成方法和Cron表达式的详细介绍。

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring-Reference_zh_CN(Spring中文参考手册)

    11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口 ...

    Spring 2.0 开发参考手册

    11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...

    Quartz Job Scheduling Framework 中文版

    于是想起了 Spring 框架整合了一个作业调度框架 Quartz,其实一直没用过它,而且这回是要脱离 Spring 框架来使用 Quartz。于是就到网上找来 Quartz 相关的资料,介绍使用倒也不含糊,但缺乏系统与深度,继而找到的...

    Spring中文帮助文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    spring定时器

    Spring定时器在SSH框架中的应用,Java的Timer类和OpenSymphony的Quartz来执行调度任务

Global site tag (gtag.js) - Google Analytics