# 示例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交流群
原创网站开发,偏差难以避免。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。