# 示例4 - 作业状态和参数

说明

此示例演示如何将参数传递给作业以及作业如何保持状态。

# ColorJob.java

package org.quartz.examples.example4;

import java.util.Date;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 这只是一个接收参数并维护状态的简单作业
 * 作者:Bill Kratzer
 */
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class ColorJob implements Job {

    private static Logger _log = LoggerFactory.getLogger(ColorJob.class);
    
    //特定于此作业的参数名称
    public static final String FAVORITE_COLOR = "favorite color";
    public static final String EXECUTION_COUNT = "count";
    
    //由于Quartz每次执行一个类时都会重新实例化它,所以非静态成员变量不能用于维护状态!
    private int _counter = 1;

    /**
     * 用于作业初始化的空构造函数
     * Quartz需要一个公共的空构造函数,以便调度器可以在需要时实例化类
     */
    public ColorJob() {
    }

    /**
     * 当与此作业相关联的触发器触发时,由调度器调用此方法
     * Throws:作业执行异常(JobExecutionException)-当执行作业时产生异常
     */
    public void execute(JobExecutionContext context)
        throws JobExecutionException {

        //此作业只需打印出其作业名称及其运行的日期和时间
        JobKey jobKey = context.getJobDetail().getKey();
        
        //抓取并打印传递的参数
        JobDataMap data = context.getJobDetail().getJobDataMap();
        String favoriteColor = data.getString(FAVORITE_COLOR);
        int count = data.getInt(EXECUTION_COUNT);
        _log.info("ColorJob: " + jobKey + " executing at " + new Date() + "\n" +
            "  favorite color is " + favoriteColor + "\n" + 
            "  execution count (from job map) is " + count + "\n" + 
            "  execution count (from job member variable) is " + _counter);
        
        //增加计数并将其存储回作业映射中,以便正确维护作业状态
        count++;
        data.put(EXECUTION_COUNT, count);
        
        //增加本地成员变量 
        //由于无法通过成员变量维护作业状态,因此这没有实际意义!
        _counter++;
    }

}

# JobStateExample.java源码

package org.quartz.examples.example4;

import static org.quartz.DateBuilder.nextGivenSecondDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;

/**
 * 本示例将演示如何将作业参数传递到作业中以及如何维护状态
 * 作者:Bill Kratzer
 */
public class JobStateExample {

  public void run() throws Exception {
    Logger log = LoggerFactory.getLogger(JobStateExample.class);

    log.info("------- Initializing -------------------");

    //首先,我们必须获得对调度器的引用 
    SchedulerFactory sf = new StdSchedulerFactory();
    Scheduler sched = sf.getScheduler();

    log.info("------- Initialization Complete --------");

    log.info("------- Scheduling Jobs ----------------");

    //在未来10秒后获得1次不错的轮转时间(开始执行所有作业)
    Date startTime = nextGivenSecondDate(null, 10);

    //作业1将运行5次(运行1次后再重复4次),每10秒重复1次
    JobDetail job1 = newJob(ColorJob.class).withIdentity("job1", "group1").build();

    SimpleTrigger trigger1 = newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
        .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(4)).build();

    //将初始化参数传递到作业中
    job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green");
    job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);

    //安排作业执行
    Date scheduleTime1 = sched.scheduleJob(job1, trigger1);
    log.info(job1.getKey() + " will run at: " + scheduleTime1 + " and repeat: " + trigger1.getRepeatCount()
             + " times, every " + trigger1.getRepeatInterval() / 1000 + " seconds");

    //作业2也将运行5次,每10秒重复1次
    JobDetail job2 = newJob(ColorJob.class).withIdentity("job2", "group1").build();

    SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2", "group1").startAt(startTime)
        .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(4)).build();

    //将初始化参数传递到作业中,此作业具有不同的最喜爱颜色!
    job2.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Red");
    job2.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);

    //安排作业执行
    Date scheduleTime2 = sched.scheduleJob(job2, trigger2);
    log.info(job2.getKey().toString() + " will run at: " + scheduleTime2 + " and repeat: " + trigger2.getRepeatCount() + " times, every " + trigger2.getRepeatInterval() / 1000 + " seconds");

    log.info("------- Starting Scheduler ----------------");

    //所有作业都已添加到调度器中,但在调度器启动之前,所有作业都不会执行
    sched.start();

    log.info("------- Started Scheduler -----------------");

    log.info("------- Waiting 60 seconds... -------------");
    try {
      //等待5分钟以显示作业
      Thread.sleep(60L * 1000L);
      //执行中…
    } catch (Exception e) {
      //
    }

    log.info("------- Shutting Down ---------------------");

    sched.shutdown(true);

    log.info("------- Shutdown Complete -----------------");

    SchedulerMetaData metaData = sched.getMetaData();
    log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");

  }

  public static void main(String[] args) throws Exception {

    JobStateExample example = new JobStateExample();
    example.run();
  }

}

# 控制台输出

[main] INFO org.quartz.examples.example4.JobStateExample - ------- Initializing -------------------
[main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
[main] INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main
[main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.0 created.
[main] INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.0
[main] INFO org.quartz.examples.example4.JobStateExample - ------- Initialization Complete --------
[main] INFO org.quartz.examples.example4.JobStateExample - ------- Scheduling Jobs ----------------
[main] INFO org.quartz.examples.example4.JobStateExample - group1.job1 will run at: Tue Nov 29 23:55:30 CST 2022 and repeat: 4 times, every 10 seconds
[main] INFO org.quartz.examples.example4.JobStateExample - group1.job2 will run at: Tue Nov 29 23:55:30 CST 2022 and repeat: 4 times, every 10 seconds
[main] INFO org.quartz.examples.example4.JobStateExample - ------- Starting Scheduler ----------------
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
[main] INFO org.quartz.examples.example4.JobStateExample - ------- Started Scheduler -----------------
[main] INFO org.quartz.examples.example4.JobStateExample - ------- Waiting 60 seconds... -------------
[DefaultQuartzScheduler_Worker-1] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job1 executing at Tue Nov 29 23:55:30 CST 2022
  favorite color is Green
  execution count (from job map) is 1
  execution count (from job member variable) is 1
[DefaultQuartzScheduler_Worker-2] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job2 executing at Tue Nov 29 23:55:30 CST 2022
  favorite color is Red
  execution count (from job map) is 1
  execution count (from job member variable) is 1
[DefaultQuartzScheduler_Worker-3] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job1 executing at Tue Nov 29 23:55:40 CST 2022
  favorite color is Green
  execution count (from job map) is 2
  execution count (from job member variable) is 1
[DefaultQuartzScheduler_Worker-4] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job2 executing at Tue Nov 29 23:55:40 CST 2022
  favorite color is Red
  execution count (from job map) is 2
  execution count (from job member variable) is 1
[DefaultQuartzScheduler_Worker-5] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job1 executing at Tue Nov 29 23:55:50 CST 2022
  favorite color is Green
  execution count (from job map) is 3
  execution count (from job member variable) is 1
[DefaultQuartzScheduler_Worker-6] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job2 executing at Tue Nov 29 23:55:50 CST 2022
  favorite color is Red
  execution count (from job map) is 3
  execution count (from job member variable) is 1
[DefaultQuartzScheduler_Worker-7] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job1 executing at Tue Nov 29 23:56:00 CST 2022
  favorite color is Green
  execution count (from job map) is 4
  execution count (from job member variable) is 1
[DefaultQuartzScheduler_Worker-8] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job2 executing at Tue Nov 29 23:56:00 CST 2022
  favorite color is Red
  execution count (from job map) is 4
  execution count (from job member variable) is 1
[DefaultQuartzScheduler_Worker-9] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job1 executing at Tue Nov 29 23:56:10 CST 2022
  favorite color is Green
  execution count (from job map) is 5
  execution count (from job member variable) is 1
[DefaultQuartzScheduler_Worker-10] INFO org.quartz.examples.example4.ColorJob - ColorJob: group1.job2 executing at Tue Nov 29 23:56:10 CST 2022
  favorite color is Red
  execution count (from job map) is 5
  execution count (from job member variable) is 1
[main] INFO org.quartz.examples.example4.JobStateExample - ------- Shutting Down ---------------------
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
[main] INFO org.quartz.examples.example4.JobStateExample - ------- Shutdown Complete -----------------
[main] INFO org.quartz.examples.example4.JobStateExample - Executed 10 jobs.

Process finished with exit code 0

微信公众号

QQ交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。