zoukankan      html  css  js  c++  java
  • quartz任务调度基础: Job/Trigger/Schedule

    1、Quartz基本用法

           参见官方说明:[Quartz Job Scheduler]

          三大核心元素:

    •       Job:定义要执行的任务
    •       triggers:任务触发策略
    •       scheduler:关联job和trigger

    1.1  调度器scheduler

          scheduler的初始化和启动 

      // 工厂方式创建调度器实例Scheduler
      Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
      ...
      scheduler.scheduleJob(job, trigger); //将任务与触发器关联起来
      // 启动,开始调度 
      scheduler.start();

    1.2  任务Jobs

            实现Job,其中包含一个.execute()方法

      import org.quartz.Scheduler;
      import org.quartz.SchedulerException;
      import org.quartz.impl.StdSchedulerFactory;
      import static org.quartz.JobBuilder.*;
      import static org.quartz.TriggerBuilder.*;
      import static org.quartz.SimpleScheduleBuilder.*;
    
    public class MyJob implements org.quartz.Job {
    
          public MyJob() {
          }
        
        // Quartz调度运行任务时,即执行execute()方法
    public void execute(JobExecutionContext context) throws JobExecutionException { System.err.println("Hello World! MyJob is executing."); } }

    1.3 触发器triggers

      通过trigger触发任务执行(triggers定义了job在什么时候运行。)

      // 定义job,并与MyJob绑定。
      JobDetail job = newJob(MyJob.class)
          .withIdentity("job1", "group1")
          .build();
    
      // Trigger 触发job立即执行,并每隔40s重复一次。
      Trigger trigger = newTrigger()
          .withIdentity("trigger1", "group1")
          .startNow()
          .withSchedule(simpleSchedule()
                  .withIntervalInSeconds(40)
                  .repeatForever())
          .build();
    
      // 调度器用于将任务与触发器关联起来。(任务和触发器可以是多对多的关系,)
      scheduler.scheduleJob(job, trigger);
    

    2、 再举例

    2.1 调度的任务JOB

    (与上述Job类一致)

    package com.mypractice.quartz;
    
    import java.text.SimpleDateFormat;
    import java.time.format.DateTimeFormatterBuilder;
    import java.util.Date;
    
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    
    public class HelloJob  implements Job{
    
        public void execute(JobExecutionContext context) throws JobExecutionException {
            SimpleDateFormat time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
            String dsc = context.getJobDetail().getDescription();
            String name = context.getJobDetail().getJobDataMap().getString("name");
            System.out.println(time.format(new java.util.Date()) +" hello, " + name + ". " + dsc + " ");
        }
    
    }

     2.2 可以添加trigger的监听(实现TriggerListener接口)

    trigger的配置在上一部分已做描述,此处是添加了触发器的监听。

    以下示例中,在触发执行完后做了打印输出。

    package com.mypractice.quartz;
    
    import org.quartz.JobExecutionContext;
    import org.quartz.Trigger;
    import org.quartz.Trigger.CompletedExecutionInstruction;
    import org.quartz.TriggerListener;
    
    public class myJobTriggerListener implements TriggerListener {
    
        public String getName() {
            // TODO Auto-generated method stub
            return "user_defined_Trigger";
        }
    
        public void triggerFired(Trigger trigger, JobExecutionContext context) {
            // TODO Auto-generated method stub
            
        }
    
        public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
            // TODO Auto-generated method stub
            return false;
        }
    
        public void triggerMisfired(Trigger trigger) {
            // TODO Auto-generated method stub
            
        }
    
        public void triggerComplete(Trigger trigger, JobExecutionContext context,
                CompletedExecutionInstruction triggerInstructionCode) {
            String name = context.getJobDetail().getJobDataMap().getString("name");
            String dsc = context.getJobDetail().getDescription();
            System.out.println("compelte " + name  + " " +dsc);
        }
    }

    2.3 整体测试代码

    package com.mypractice.quartz;
    
    import org.quartz.CronScheduleBuilder;
    import org.quartz.JobBuilder;
    import org.quartz.JobDetail;
    import org.quartz.JobListener;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.SchedulerFactory;
    import org.quartz.Trigger;
    import org.quartz.TriggerBuilder;
    import org.quartz.impl.StdSchedulerFactory;
    
    public class TestQuartzMain {
    
        public static void main(String[] args) throws SchedulerException {
            //scheduler
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            Scheduler sch = schedulerFactory.getScheduler();
            
            //1. Job 
            //JobDetail jobDetail =  new JobDetail("jobDetail-s1", "jobDetailGroup-s1", HelloJob.class); 
            //(qurtz1.*版本之前是以上用法)
    JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) .withIdentity("helloJob", "groupJob")//given name and group to identify the JobDetail. .usingJobData("name", "孙悟空")//Add the given key-value pair to the JobDetail's .withDescription("齐天大圣") .build(); //2. trigger Trigger trigger1 = TriggerBuilder.newTrigger() .withIdentity("cron trigger", "groupTrigger") .withSchedule( //每5秒执行一次 CronScheduleBuilder.cronSchedule("0/5 * * ? * *") ).build(); // (附加) 加入triggerlistener。 sch.getListenerManager().addTriggerListener(new myJobTriggerListener()); //3. 把job、trigger注册到任务调度中 sch.scheduleJob(jobDetail, trigger1); //4. 启动调度 sch.start(); } }

    输出

    2017-05-25 01:05:00 hello, 孙悟空. 齐天大圣 
    compelte 孙悟空 齐天大圣
    2017-05-25 01:05:05 hello, 孙悟空. 齐天大圣 
    compelte 孙悟空 齐天大圣
    2017-05-25 01:05:10 hello, 孙悟空. 齐天大圣
    ...
  • 相关阅读:
    Linux 环境下umount, 报 device is busy 的问题分析与解决方法
    WScript与CScript的区别
    20170803上课笔记
    20170802上课随笔
    20170801上课笔记
    20170731上课笔记
    20170729上课笔记
    20170727上课笔记
    20170726上课笔记
    20170725上课笔记
  • 原文地址:https://www.cnblogs.com/eaglediao/p/6901733.html
Copyright © 2011-2022 走看看