2、quartz程序实例

来源:互联网 发布:黑光灯诱捕法估算法 编辑:程序博客网 时间:2024/05/21 09:47

场景一:设置时间间隔执行定时任务


1、引入quartz必须的包



2、新建一个定时任务实例

继承Job方法,实现execute方法,方法里面就是你要执行的内容

       

package com.cn.demo1;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;public class Task1 implements Job{@Overridepublic void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("第一个定时任务实例!");}}

2、新建一个定时任务启动方法


package com.cn.demo1;import java.util.Date;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.SimpleTrigger;import org.quartz.impl.StdSchedulerFactory;public class StartTask1 {/** * log4j:WARN No appenders could be found for logger (org.quartz.simpl.SimpleThreadPool).   log4j:WARN Please initialize the log4j system properly.          定时任务执行报如上错,因为缺少log4j.properties配置文件的缘故 */public static void main(String[] args) throws SchedulerException {start();}private static void start() throws SchedulerException {//通过SchedulerFactory来获取一个调度器        SchedulerFactory schedulerFactory = new StdSchedulerFactory();        Scheduler scheduler = schedulerFactory.getScheduler();                //引进作业程序        JobDetail jobDetail =         new JobDetail("jobDetail-s1", "jobDetailGroup-s1", Task1.class);        //new一个触发器        SimpleTrigger simpleTrigger =         new SimpleTrigger("simpleTrigger", "triggerGroup-s1");        //设置作业启动时间        long ctime = System.currentTimeMillis();         simpleTrigger.setStartTime(new Date(ctime));        //设置作业执行间隔         simpleTrigger.setRepeatInterval(10000);        //设置作业执行次数        simpleTrigger.setRepeatCount(5);        //设置作业执行优先级默认为5        //simpleTrigger.setPriority(10);        //作业和触发器设置到调度器中        scheduler.scheduleJob(jobDetail, simpleTrigger);                //启动调度器        scheduler.start();}}


3、启动,输出结果


   值得注意的是:启动的时候,作业执行次数是5,但是实际上,定时任务执行了6次。定时任务启动,会先执行一次,然后,重复5次。所以,最终会输出6次打印结果。

   另外,针对log4j:WARN No appenders could be found for logger (org.quartz.simpl.SimpleThreadPool).
               log4j:WARN Please initialize the log4j system properly.

   是因为缺少log4j.properties配置文件的缘故,大家根据需要加上即可,不影响程序运行。


   

   场景二:在某些特定的时间点执行。

   这个时候,我们就需要采用CronTrigger,通过配置cron表达式,定时执行。

   下面我们来看一个实例:


  1、新建一个定时任务实例

package com.cn.demo2;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.StatefulJob;public class Task2 implements Job{@Overridepublic void execute(JobExecutionContext arg0) throws JobExecutionException {System.out.println("第二个定时任务实例!");}}

2、新建一个定时任务启动方法

package com.cn.demo2;import java.text.ParseException;import org.quartz.CronTrigger;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.impl.StdSchedulerFactory;public class StartTask2 {public static void main(String[] args) throws SchedulerException, ParseException {start();}private static void start() throws SchedulerException, ParseException {      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();      JobDetail jobDetail = new JobDetail("myJob", Scheduler.DEFAULT_GROUP,      Task2.class);      CronTrigger trigger = new CronTrigger("crontrigger",Scheduler.DEFAULT_GROUP, "* * * * * ?");      trigger.getJobDataMap().put("count", 0);    scheduler.scheduleJob(jobDetail, trigger);    scheduler.start(); }}

3、启动,输出结果

     


场景三:同一时刻相同的job只有一个在执行【有状态作业

     如果使用了Quartz,当然在一个系统中绝不仅仅是一个job那么简单,如果同一个job同一时刻运行,可能会造成重复入库的情况。

     所以我们希望多线程时,能够控制同一时刻相同job只能有一个正在执行。


    quartz提供了Job之外的接口:org.quartz.StatefulJob

   我们只需要将org.quartz.Job替换成org.quartz.StatefulJob接口。实现org.quartz.StatefulJob接口即可。


   当第二次job启动的时候第一个job还没执行完,第二个job会一直阻塞直到第一个job执行完毕。