Quartz使用

本文介绍如何使用Quartz进行任务调度,包括配置Quartz、创建Job实现类、定义触发器并运行示例。同时提供了常见错误解决方案及cron表达式的详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务调度在目前的Java应用程序中运用的十分普遍,故掌握QUARTZ是必备的技能
闲话少说,上官网:http://www.quartz-scheduler.org/ 下载最新1.80资源包
commons-logging log4j sff4j 等jar包要添加进去,quartz的jar包则肯定必须
首先写一个类实现Job接口

public class QuartzDemo implements Job{  

    @Override  
    public void execute(JobExecutionContext arg0) throws JobExecutionException {  
        System.out.println("执行我.......");     
    }  
}  

[html] view plain copy
public class Test {  
    private static final SimpleTrigger CronTrigger = null;  

    public static void main(String[] args){  
    }  

    public void test1(){  
          //通过SchedulerFactory来获取一个调度器  
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();  
        Scheduler scheduler;  
        try {  
            scheduler = schedulerFactory.getScheduler();  
            //引进作业程序  
            JobDetail jobDetail =   
            new JobDetail("jobDetail-s1", "jobDetailGroup-s1", QuartzDemo.class);  

             //new一个触发器  
            SimpleTrigger simpleTrigger =   
            new SimpleTrigger("simpleTrigger", "triggerGroup-s1");  


            //设置作业启动时间  

            long ctime = System.currentTimeMillis();   
            simpleTrigger.setStartTime(new Date(ctime));  


            //设置作业执行间隔   
            simpleTrigger.setRepeatInterval(1000);  

            //设置作业执行次数  
            simpleTrigger.setRepeatCount(10);  

            //设置作业执行优先级默认为5  
            //simpleTrigger.setPriority(10);  


            //作业和触发器设置到调度器中  
            scheduler.scheduleJob(jobDetail, simpleTrigger);  

            //启动调度器  
            scheduler.start();  
        } catch (SchedulerException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  

    public void test2(){  

        try    {  
            SchedulerFactory schedFact  =   new  org.quartz.impl.StdSchedulerFactory();  
            Scheduler sched  =  schedFact.getScheduler();  
            sched.start();  
            JobDetail jobDetail  =   new  JobDetail( " Income Report " ,  
                     " Report Generation " , QuartzDemo.class );  
            jobDetail.getJobDataMap().put( " type " ,  " FULL " );  
            CronTrigger trigger  =   new  CronTrigger( " Income Report " ,  
                     " Report Generation " );  
             /**/ /*  每1分钟执行一次  */   
            trigger.setCronExpression( "0 33 16 * * ?" );  
            sched.scheduleJob(jobDetail, trigger);  
        }   catch  (Exception e)   {  
            e.printStackTrace();  
        }   
    }  

    public void test3(){  
         //通过SchedulerFactory来获取一个调度器  
      SchedulerFactory schedulerFactory = new StdSchedulerFactory();  
      Scheduler scheduler;  
        try {  
            scheduler = schedulerFactory.getScheduler();    
      //引进作业程序  
      JobDetail jobDetail =   
      new JobDetail("jobDetail-s1", "jobDetailGroup-s1", QuartzDemo.class);  
       //new一个触发器  
      CronTrigger simpleTrigger =   
        new CronTrigger("trigger", "group", "job", "group", "16 26/1 8-17 * * ?");  
     // new SimpleTrigger("simpleTrigger", "triggerGroup-s1");  


      //设置作业启动时间  
    //Calendar excelCal = Calendar.getInstance();  
        //excelCal.add(Calendar.DAY_OF_MONTH, 1);  
        ///excelCal.set(Calendar.HOUR_OF_DAY, 16);  
        //excelCal.set(Calendar.SECOND, 0);  
        //excelCal.add(Calendar.MINUTE, 9);  
     // long ctime = System.currentTimeMillis();   
     // simpleTrigger.setStartTime(excelCal.getTime());  
      //设置作业执行间隔   
     // simpleTrigger.setRepeatInterval(1000);  
      //设置作业执行次数  
     // simpleTrigger.setRepeatCount(10);  
      //设置作业执行优先级默认为5  
      //simpleTrigger.setPriority(10);  

      //作业和触发器设置到调度器中  
      scheduler.scheduleJob(jobDetail, simpleTrigger);  

      //启动调度器  
      scheduler.start();  
        } catch (SchedulerException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (ParseException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }            
    }  
}  

需要注意的几点是经常会出现org.quartz.core.ErrorLogger : An error occured instantiating job to be executed…..这种异常,解决办法是
1)Job类必须有默认的无参构造方法,当然不覆盖的话类本身就是无参的构造方法
2)Job的scope必须是Public类型的,因为quartz根据反射机制实例化类,如果不是public的,无法对其暴露
3) Job类不能是内部类,原因同上,所以最好单独建类

后附加上我网上搜集的
[html] view plain copy
Quartz的配置文件:quartz.properties

Configure Main Scheduler Properties

org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = one

Configure ThreadPool

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 4

Configure JobStore

org.quartz.jobStore.misfireThreshold = 5000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

附:cronExpression配置说明

字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /

表达式 意义
“0 0 12 * * ?” 每天中午12点触发
“0 15 10 ? * *” 每天上午10:15触发
“0 15 10 * * ?” 每天上午10:15触发
“0 15 10 * * ? *” 每天上午10:15触发
“0 15 10 * * ? 2005” 2005年的每天上午10:15触发
“0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
“0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
“0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发
“0 15 10 15 * ?” 每月15日上午10:15触发
“0 15 10 L * ?” 每月最后一日的上午10:15触发
“0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发

特殊字符 意义
* 表示所有值;
? 表示未说明的值,即不关心它为何值;
- 表示一个指定的范围;
, 表示附加一个可能值;
/ 符号前表示开始时间,符号后表示每次递增的值;
L(“last”) (“last”) “L” 用在day-of-month字段意思是 “这个月最后一天”;用在 day-of-week字段, 它简单意思是 “7” or “SAT”。 如果在day-of-week字段里和数字联合使用,它的意思就是 “这个月的最后一个星期几” – 例如: “6L” means “这个月的最后一个星期五”. 当我们用“L”时,不指明一个列表值或者范围是很重要的,不然的话,我们会得到一些意想不到的结果。
W(“weekday”) 只能用在day-of-month字段。用来描叙最接近指定天的工作日(周一到周五)。例如:在day-of-month字段用“15W”指“最接近这个月第15天的工作日”,即如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发;如果这个月第15天是周日,那么触发器将会在这个月第16天即周一触发;如果这个月第15天是周二,那么就在触发器这天触发。注意一点:这个用法只会在当前月计算值,不会越过当前月。“W”字符仅能在day-of-month指明一天,不能是一个范围或列表。也可以用“LW”来指定这个月的最后一个工作日。

只能用在day-of-week字段。用来指定这个月的第几个周几。例:在day-of-week字段用”6#3”指这个月第3个周五(6指周五,3指第3个)。如果指定的日期不存在,触发器就不会触发。

C 指和calendar联系后计算过的值。例:在day-of-month 字段用“5C”指在这个月第5天或之后包括calendar的第一天;在day-of-week字段用“1C”指在这周日或之后包括calendar的第一天

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值