<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>1.7.25version>
dependency>
<dependency>
<groupId>org.quartz-schedulergroupId>
<artifactId>quartzartifactId>
<version>2.2.3version>
dependency>
<dependency>
<groupId>org.quartz-schedulergroupId>
<artifactId>quartz-jobsartifactId>
<version>2.2.3version>
dependency>
log4j.xml
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="default" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>
layout>
appender>
<logger name="org.quartz">
<level value="error" />
logger>
<root>
<level value="debug" />
<appender-ref ref="default" />
root>
log4j:configuration>
定义一个任务,实现Job 接口
public class EchoJob implements Job {
private static Logger _log = LoggerFactory.getLogger(EchoJob.class);
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
_log.debug("echo: 入门例子");
}
}
将任务和调度器绑定起来
/**
* Created by it
* Created in 2019年1月26日
* Description:
*/
public class Example1 {
private static Logger _log = LoggerFactory.getLogger(Example1.class);
public static void main(String[] args) throws Exception {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
_log.debug("调度器启动成功...");
// 定义一次任务
JobDetail job = JobBuilder.newJob(EchoJob.class)
.withIdentity("jobName1", "groupName1").build();
// 定义执行时间,2秒1次
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("triggerName1", "groupName1")
.withSchedule(
CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))
.build();
_log.debug("调度器,添加一次任务:{}", job.getKey());
scheduler.scheduleJob(job, trigger);
TimeUnit.SECONDS.sleep(10);
scheduler.shutdown(true);
_log.debug("调度器10秒后停止,shutdown入参:{},让任务调度完", true);
}
}
测试
[DEBUG] 27 一月 03:47:24.020 下午 main [priv.dengjl.my_quartz.scheduler.Example1]
调度器启动成功...
[DEBUG] 27 一月 03:47:24.033 下午 main [priv.dengjl.my_quartz.scheduler.Example1]
调度器,添加一次任务:groupName1.jobName1
[DEBUG] 27 一月 03:47:24.044 下午 DefaultQuartzScheduler_Worker-1 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 03:47:26.005 下午 DefaultQuartzScheduler_Worker-2 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 03:47:28.001 下午 DefaultQuartzScheduler_Worker-3 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 03:47:30.001 下午 DefaultQuartzScheduler_Worker-4 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 03:47:32.000 下午 DefaultQuartzScheduler_Worker-5 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 03:47:34.001 下午 DefaultQuartzScheduler_Worker-6 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 03:47:34.511 下午 main [priv.dengjl.my_quartz.scheduler.Example1]
调度器20秒后停止,shutdown入参:true,让任务调度完
Trigger中的时间设置
我在quartz只是用CronTrigger方式,其他不考虑,实际工程也是用cron表达式
cron表达式在线生成:http://cron.qqe2.com/
定义一个任务,实现Job 接口
public class EchoParameterJob implements Job {
private static Logger _log = LoggerFactory.getLogger(EchoParameterJob.class);
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
_log.debug("JobDetail: 输出传递参数:{}", jobDataMap.getString("param"));
JobDataMap jobDataMap2 = context.getTrigger().getJobDataMap();
_log.debug("Trigger: 输出传递参数:{}", jobDataMap2.getString("param2"));
}
}
参数传递
/**
* Created by it
* Created in 2019年1月26日
* Description: 参数传递
*/
public class Example2 {
private static Logger _log = LoggerFactory.getLogger(Example2.class);
public static void main(String[] args) throws Exception {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
_log.debug("调度器启动成功...");
// job参数传递
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("param", "测试数据");
// 定义一次任务
JobDetail job = JobBuilder
.newJob(EchoParameterJob.class)
.withIdentity("jobName1", "groupName1")
.usingJobData(jobDataMap)
.build();
// trigger参数传递
JobDataMap jobDataMap2 = new JobDataMap();
jobDataMap2.put("param2", "xxxxxxx");
// 定义执行时间,2秒1次
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("triggerName1", "groupName1")
.usingJobData(jobDataMap2)
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))
.build();
_log.debug("调度器,添加一次任务:{}", job.getKey());
scheduler.scheduleJob(job, trigger);
TimeUnit.SECONDS.sleep(4);
scheduler.shutdown(true);
_log.debug("调度器4秒后停止,shutdown入参:{},让任务调度完", true);
}
}
测试
[DEBUG] 27 一月 04:21:43.053 下午 main [priv.dengjl.my_quartz.scheduler.Example2]
调度器启动成功...
[DEBUG] 27 一月 04:21:43.080 下午 main [priv.dengjl.my_quartz.scheduler.Example2]
调度器,添加一次任务:groupName1.jobName1
[DEBUG] 27 一月 04:21:44.009 下午 DefaultQuartzScheduler_Worker-1 [priv.dengjl.my_quartz.job.EchoParameterJob]
JobDetail: 输出传递参数:测试数据
[DEBUG] 27 一月 04:21:44.010 下午 DefaultQuartzScheduler_Worker-1 [priv.dengjl.my_quartz.job.EchoParameterJob]
Trigger: 输出传递参数:xxxxxxx
[DEBUG] 27 一月 04:21:46.001 下午 DefaultQuartzScheduler_Worker-2 [priv.dengjl.my_quartz.job.EchoParameterJob]
JobDetail: 输出传递参数:测试数据
[DEBUG] 27 一月 04:21:46.001 下午 DefaultQuartzScheduler_Worker-2 [priv.dengjl.my_quartz.job.EchoParameterJob]
Trigger: 输出传递参数:xxxxxxx
[DEBUG] 27 一月 04:21:47.540 下午 main [priv.dengjl.my_quartz.scheduler.Example2]
调度器4秒后停止,shutdown入参:true,让任务调度完
注册监听事件
/**
* Created by it
* Created in 2019年1月26日
* Description: 监听器的使用
*/
public class Example3 {
private static Logger _log = LoggerFactory.getLogger(Example3.class);
public static void main(String[] args) throws Exception {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
_log.debug("调度器启动成功...");
// 注册监听器
scheduler.getListenerManager().addSchedulerListener(new MySchedulerListener());
scheduler.getListenerManager().addJobListener(new MyJobListener(), KeyMatcher.keyEquals(new JobKey("jobName1", "groupName1")));
// 一般不用riggerListener事件
//scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(new TriggerKey("jobName1", "groupName1")));
// 定义一次任务
JobDetail job = JobBuilder.newJob(EchoJob.class)
.withIdentity("jobName1", "groupName1").build();
// 定义执行时间,2秒1次
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("triggerName1", "groupName1")
.withSchedule(
CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))
.build();
_log.debug("调度器,添加一次任务:{}", job.getKey());
scheduler.scheduleJob(job, trigger);
TimeUnit.SECONDS.sleep(6);
scheduler.shutdown(true);
_log.debug("调度器10秒后停止,shutdown入参:{},让任务调度完", true);
}
}
SchedulerListener监听器
public class MySchedulerListener implements SchedulerListener {
private static Logger _log = LoggerFactory.getLogger(MySchedulerListener.class);
@Override
public void jobScheduled(Trigger trigger) {
_log.debug("SchedulerListener中事件:{}", "jobScheduled");
}
@Override
public void jobUnscheduled(TriggerKey triggerKey) {
_log.debug("SchedulerListener中事件:{}", "jobUnscheduled");
}
@Override
public void triggerFinalized(Trigger trigger) {
_log.debug("SchedulerListener中事件:{}", "triggerFinalized");
}
@Override
public void triggerPaused(TriggerKey triggerKey) {
_log.debug("SchedulerListener中事件:{}", "triggerPaused");
}
@Override
public void triggersPaused(String triggerGroup) {
_log.debug("SchedulerListener中事件:{}", "triggersPaused");
}
@Override
public void triggerResumed(TriggerKey triggerKey) {
_log.debug("SchedulerListener中事件:{}", "triggerResumed");
}
@Override
public void triggersResumed(String triggerGroup) {
_log.debug("SchedulerListener中事件:{}", "triggersResumed");
}
@Override
public void jobAdded(JobDetail jobDetail) {
_log.debug("SchedulerListener中事件:{}", "jobAdded");
}
@Override
public void jobDeleted(JobKey jobKey) {
_log.debug("SchedulerListener中事件:{}", "jobDeleted");
}
@Override
public void jobPaused(JobKey jobKey) {
_log.debug("SchedulerListener中事件:{}", "jobPaused");
}
@Override
public void jobsPaused(String jobGroup) {
_log.debug("SchedulerListener中事件:{}", "jobsPaused");
}
@Override
public void jobResumed(JobKey jobKey) {
_log.debug("SchedulerListener中事件:{}", "jobResumed");
}
@Override
public void jobsResumed(String jobGroup) {
_log.debug("SchedulerListener中事件:{}", "jobsResumed");
}
@Override
public void schedulerError(String msg, SchedulerException cause) {
_log.debug("SchedulerListener中事件:{}", "schedulerError");
}
@Override
public void schedulerInStandbyMode() {
_log.debug("SchedulerListener中事件:{}", "schedulerInStandbyMode");
}
@Override
public void schedulerStarted() {
_log.debug("SchedulerListener中事件:{}", "schedulerStarted");
}
@Override
public void schedulerStarting() {
_log.debug("SchedulerListener中事件:{}", "schedulerStarting");
}
@Override
public void schedulerShutdown() {
_log.debug("SchedulerListener中事件:{}", "schedulerShutdown");
}
@Override
public void schedulerShuttingdown() {
_log.debug("SchedulerListener中事件:{}", "schedulerShuttingdown");
}
@Override
public void schedulingDataCleared() {
_log.debug("SchedulerListener中事件:{}", "schedulingDataCleared");
}
}
JobListener监听器
public class MyJobListener implements JobListener {
private static Logger _log = LoggerFactory.getLogger(MyJobListener.class);
@Override
public String getName() {
return "MyJobListener";
}
@Override
public void jobToBeExecuted(JobExecutionContext context) {
_log.debug("MyJobListener中事件:{}", "jobToBeExecuted");
}
@Override
public void jobExecutionVetoed(JobExecutionContext context) {
_log.debug("MyJobListener中事件:{}", "jobExecutionVetoed");
}
@Override
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
_log.debug("MyJobListener中事件:{}", "jobWasExecuted");
}
}
测试
[DEBUG] 27 一月 04:53:46.003 下午 main [priv.dengjl.my_quartz.scheduler.Example3]
调度器启动成功...
[DEBUG] 27 一月 04:53:46.018 下午 main [priv.dengjl.my_quartz.scheduler.Example3]
调度器,添加一次任务:groupName1.jobName1
[DEBUG] 27 一月 04:53:46.020 下午 main [priv.dengjl.my_quartz.listenner.MySchedulerListener]
SchedulerListener中事件:jobAdded
[DEBUG] 27 一月 04:53:46.020 下午 main [priv.dengjl.my_quartz.listenner.MySchedulerListener]
SchedulerListener中事件:jobScheduled
[DEBUG] 27 一月 04:53:46.029 下午 DefaultQuartzScheduler_Worker-1 [priv.dengjl.my_quartz.listenner.MyJobListener]
MyJobListener中事件:jobToBeExecuted
[DEBUG] 27 一月 04:53:46.029 下午 DefaultQuartzScheduler_Worker-1 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 04:53:46.029 下午 DefaultQuartzScheduler_Worker-1 [priv.dengjl.my_quartz.listenner.MyJobListener]
MyJobListener中事件:jobWasExecuted
[DEBUG] 27 一月 04:53:48.001 下午 DefaultQuartzScheduler_Worker-2 [priv.dengjl.my_quartz.listenner.MyJobListener]
MyJobListener中事件:jobToBeExecuted
[DEBUG] 27 一月 04:53:48.001 下午 DefaultQuartzScheduler_Worker-2 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 04:53:48.001 下午 DefaultQuartzScheduler_Worker-2 [priv.dengjl.my_quartz.listenner.MyJobListener]
MyJobListener中事件:jobWasExecuted
[DEBUG] 27 一月 04:53:50.005 下午 DefaultQuartzScheduler_Worker-3 [priv.dengjl.my_quartz.listenner.MyJobListener]
MyJobListener中事件:jobToBeExecuted
[DEBUG] 27 一月 04:53:50.006 下午 DefaultQuartzScheduler_Worker-3 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 04:53:50.007 下午 DefaultQuartzScheduler_Worker-3 [priv.dengjl.my_quartz.listenner.MyJobListener]
MyJobListener中事件:jobWasExecuted
[DEBUG] 27 一月 04:53:52.001 下午 DefaultQuartzScheduler_Worker-4 [priv.dengjl.my_quartz.listenner.MyJobListener]
MyJobListener中事件:jobToBeExecuted
[DEBUG] 27 一月 04:53:52.001 下午 DefaultQuartzScheduler_Worker-4 [priv.dengjl.my_quartz.job.EchoJob]
echo: 入门例子
[DEBUG] 27 一月 04:53:52.001 下午 DefaultQuartzScheduler_Worker-4 [priv.dengjl.my_quartz.listenner.MyJobListener]
MyJobListener中事件:jobWasExecuted
[DEBUG] 27 一月 04:53:52.022 下午 main [priv.dengjl.my_quartz.listenner.MySchedulerListener]
SchedulerListener中事件:schedulerInStandbyMode
[DEBUG] 27 一月 04:53:52.023 下午 main [priv.dengjl.my_quartz.listenner.MySchedulerListener]
SchedulerListener中事件:schedulerShuttingdown
[DEBUG] 27 一月 04:53:52.520 下午 main [priv.dengjl.my_quartz.listenner.MySchedulerListener]
SchedulerListener中事件:schedulerShutdown
[DEBUG] 27 一月 04:53:52.520 下午 main [priv.dengjl.my_quartz.scheduler.Example3]
调度器10秒后停止,shutdown入参:true,让任务调度完