Quartz 学习笔记

发布时间:2012-03-06 11:37:11

1Quartz 学习笔记 

实例
Scheduler scheduler=null;
try{
scheduler=StdSchedulerFactory.getDefaultScheduler();
scheduler.start();


JobDetail jobDetail=new JobDetail("myJob",Scheduler.DEFAULT_GROUP,DumbJob.class);
// Trigger trigger=new CronTrigger("myTrigger",Scheduler.DEFAULT_GROUP,"0/10 * * * * ?");//十秒钟一次
Trigger trigger=new CronTrigger("myTrigger",Scheduler.DEFAULT_GROUP,"0 0/1 * * * ? *");//设置一分钟一次
scheduler.scheduleJob(jobDetail,trigger);
}catch(SchedulerException e){
scheduler.shutdown();
}


Org.quartz.Job 接口为一个单独的job

Org.quartz. TriggerUtils Trigger的创建类,也可以使用Cron字符串建立按指定时间运行的trigger


Cron字符串分为七个字时间变量及空格分开的字符串,
分别是:秒,分,时,天,月,周,年
注:年可以不要设置
周以SUN=1,MON,TUE,WED,THU,FRI and SAT

以下是cron字符的定义用的多义字符
* 代表每一个该位置的时间
, 组合使用多个内容于一个字段
代表一个字段中以前面的为开始间隔为后面的
- 为两个数据之间
? 主要是用来设置天,周
L 用于设置天,周
#
W

2Quartz 学习笔记

quartz源代码的14个例子非常好,建议分析,执行一下。把log4j.xml拷贝到src/java即可。

CronTrigger也可以指定一个Job类。 0/15表示每15x执行一次

Scheduler.start()执行之后,任务才会被真正调度。

同一JobfullName相同的job)的JobDataMap是共享的。(example4)

roundjob,如果上一个job还没有执行结束,就需要跳过。需要从JobDataMap中获取一个状态标志isRunning,运行结束设为Idle并存入JobDataMap中。这样的一个问题是必须多过一轮才能执行到。(这样是否可以容忍了?)参考example5的实现。 haha,仔细看完example5之后,原来没那么复杂,quartz已经做得很好了,只要将job实现StatefulJob接口即可,而不是原来的Job接口,哈哈。

job fullname的规范:group1.job1
trigger fullname的规则:group1.trigger1
groupname=Task类型
jobname=j+task类名+job启动时间
triggername=t+task类名+job启动时间

如果一个job执行过程中发生异常,那么我们是否可以控制这种异常了?答:可以。quartz提供对job.execute执行过程中发生异常的继续处理流程,可以通过JobExecutionException来进行控制,比如: JobExecutionException e2 = new JobExecutionException(e); e2.refireImmediately(); //重新执行一次 e2.setUnscheduleAllTriggers(true); //让所有触发器都取消调度


如果一个定时轮询的任务,运行了一段时间,你想终止正在调度的任务,但是又不取消这个任务(仅仅终止本次调度,不影响后续的调度),此时该怎么实现?难道要自己写代码检测吗?答:不用。quartz提供了完全解决方案,你可以通过实现InterruptableJob即可。参考example7.


如何实现一个每年,每月,每天的任务调度? 答:容易,quartz提供了一系列的Calendar来加入到Scheduler的调度日历中即可。

任务结束后,让和让他回调一个Listener?答:容易,quartz提供了JobListener,在Scheduler上建立Listener,然后将ListenerJob关联,即能实现事件回调。这样可以做很多任务的关联,比如Job1执行结束后,然后将Job2放入调度器中。参考example9.

quartz的更高级特性:可持久化;当scheduler负载过大有些job可能没有被调度到,此时可以设置setRequestsRecovery来让其可以再被调度。能远程调度、EJB、和jbossapp server集成;支持cluster。基于优先级进行调度。

quartzconcurrent各自的优势:自己稍微看了一下,比较一下各自特点,不一定正确,哈哈。 quartz优势:对调度等封装得非常好,目前应用的非常广泛,成熟;但因为封装的缘故,你本身对内部的线程控制手段较少(不过可以通过listener做些处理,呵呵)。 concurrent优势:concurrent本身是jdk标准,jdk1.5才支持,支持丰富的并发处理能力,对调度要自己写很多的代码,不过concurrent本身也提供了对schedule的强大支持,而且对并发性能应该比quartz有优势,并支持Future等流行的线程通信方式。

3OpenSymphonyQuartz里的作业、调度器使用举例 

任务调度框架,它简单、易用。既可在单机J2SE应用中使用,也可在web应用中使用。 

     下载地址:http://www.opensymphony.com/quarz/download.actionquarz现在最新的版本是1.6

     如果需要在web应用中使用Quartz,只需将quartz-1.6.jar or quartz-all-1.6.jar文件复制到WEB-INFlib目录下即可。

    . Quarz的配置文件quartz.properties的介绍

    将该文件放在Wen应用的src目录下,使用举例如下:

    # 配置主调度属性
   org.quartz.scheduler.instanceName = QuartzScheduler
   org.quartz.scheduler.instanceId = AUTO
   # 配置线程池
   org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

   # 配置线程池的线程数量
   org.quartz.threadPool.threadCount = 5

   # 配置线程池里线程的优先级

   org.quartz.threadPool.threadPriority = 5
   # 配置作业存储
   org.quartz.jobStore.misfireThreshold = 60000
   org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

    . Quarz中的作业使用举例

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.*;

public class TestJob implements Job
{
    
    public void execute(JobExecutionContext context) throws JobExecutionException
    {
        System.out.println(new Date() +"    作业调度开始。");
        for (int i = 0; i < 100 ; i++)
        {
            System.out.println("作业完成" + i + 1 + "%");
        }
        System.out.println(new Date() +"    作业调度结束。");

    }
}

    . Quarz里的调度器使用举例

import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;

public class MyQuartzServer
{
    public static void main(String[] args)
    {
        MyQuartzServer server = new MyQuartzServer();
        try
        {
            server.startScheduler();
        }
        catch (SchedulerException ex)
        {
            ex.printStackTrace(); 
        }
    }
    
    protected void startScheduler() throws SchedulerException 
    {
        //使用工厂创建调度器实例
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 
        //以作业创建JobDetail实例
        JobDetail jobDetail = new JobDetail("dd", Scheduler.DEFAULT_GROUP,TestJob.class);
        //创建trigger
        Trigger trigger = new SimpleTrigger("dd",Scheduler.DEFAULT_GROUP, 5000, 200) ;
        //调度器将作业与trigger关联起来
        scheduler.scheduleJob(jobDetail, trigger ); 
        //开始调度
        scheduler.start();
    }
}

Quartz 学习笔记

相关推荐