.jpg)
开头还是那句话,懒人直接下源码,如果有疑问,请看帖子最后的总结。
本范例演示如何使用任务监听器。
本例中任务监听器会在job1执行结束后启动job2运行。
1. SimpleJob1.java
package com.zbaccp.quartz.cl.example9;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 简单任务1,只是打印出任务名和执行时刻
*
* @author 常磊
*/
public class SimpleJob1 implements Job {
private static Log _log = LogFactory.getLog(SimpleJob1.class);
public SimpleJob1() {
}
// 任务体
public void execute(JobExecutionContext context)
throws JobExecutionException {
String jobName = context.getJobDetail().getFullName();
_log.info("简单任务1说话了: " + jobName + " 运行时刻: " + new Date());
}
}
2. SimpleJob2.java
package com.zbaccp.quartz.cl.example9;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 简单任务2,只是打印出任务名和执行时刻
*
* @author 常磊
*/
public class SimpleJob2 implements Job {
private static Log _log = LogFactory.getLog(SimpleJob2.class);
public SimpleJob2() {
}
// 任务体
public void execute(JobExecutionContext context)
throws JobExecutionException {
String jobName = context.getJobDetail().getFullName();
_log.info("简单任务2说话了: " + jobName + " 运行时刻: " + new Date());
}
}
3. Job1Listener.java
package com.zbaccp.quartz.cl.example9;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
/**
* 监听器类,本范例中监听器与任务1类对应的JobDetail关联
* 执行体中启动job2
*
* @author 常磊
*/
public class Job1Listener implements JobListener {
private static Log _log = LogFactory.getLog(Job1Listener.class);
public String getName() {
return "job1_to_job2";
}
// job在执行前
public void jobToBeExecuted(JobExecutionContext inContext) {
_log.info("任务1监听器说: 任务将要被执行。");
}
// job被否决
public void jobExecutionVetoed(JobExecutionContext inContext) {
_log.info("任务1监听器说: 任务执行被否决。");
}
// job执行结束
public void jobWasExecuted(JobExecutionContext inContext,
JobExecutionException inException) {
_log.info("任务1监听器说: 任务执行结束。");
// 启动job2
JobDetail job2 = new JobDetail("job2", Scheduler.DEFAULT_GROUP,SimpleJob2.class);
SimpleTrigger trigger = new SimpleTrigger("job2Trigger",Scheduler.DEFAULT_GROUP, new Date(), null, 0, 0L);
try {
inContext.getScheduler().scheduleJob(job2, trigger);
} catch (SchedulerException e) {
_log.warn("Unable to schedule job2!");
e.printStackTrace();
}
}
}
4. ListenerExample.java
package com.zbaccp.quartz.cl.example9;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobDetail;
import org.quartz.JobListener;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
/**
*
* 本范例演示任务监听器的使用。<br/>
* 特别的地方在于,本例使用任务监听器在job1结束执行后,触发job2的执行。
*
* @author 常磊
*/
public class ListenerExample {
public void run() throws Exception {
Log log = LogFactory.getLog(ListenerExample.class);
log.info("------- 初始化开始 ----------------------");
// 1-- 排程实例化
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
log.info("------- 初始化结束 -----------");
log.info("------- 安排任务 -------------------");
// 2-- 安排job1
JobDetail job = new JobDetail("job1", "group1", SimpleJob1.class);
SimpleTrigger trigger = new SimpleTrigger("trigger1", "group1",
new Date(), null, 0, 0);
// 2.1-- 监听器加入排程
JobListener listener = new Job1Listener();
sched.addJobListener(listener);
// 2.2-- 监听器与具体的任务关联
job.addJobListener(listener.getName());
sched.scheduleJob(job, trigger);
// 3-- 启动排程
log.info("------- 启动排程 ----------------");
sched.start();
// 4-- 等待,给排程任务运行时间
log.info("------- 请等待30秒钟... --------------");
try {
Thread.sleep(30L * 1000L);
} catch (Exception e) {
}
// 5-- 关闭排程
log.info("------- 开始关闭 ---------------------");
sched.shutdown(true);
log.info("------- 关闭结束 -----------------");
SchedulerMetaData metaData = sched.getMetaData();
log.info("共执行任务 " + metaData.numJobsExecuted() + " 次。");
}
public static void main(String[] args) throws Exception {
ListenerExample example = new ListenerExample();
example.run();
}
}
5. 我们的结论
l Quartz 提供了三种类型的监听器:监听Job,监听Trigger,和监听Scheduler。
l JobListener 和 TriggerListener 可被注册为全局或者非全局的。一个全局监听器能接收到所有的 Job/Trigger 的事件通知。而一个非全局监听器(或者说标准的监听器) 只能接收到相关联的Job或Triiger 的事件。
l 对于JobListener ,要注册为一个非全局的监听器,调用 Scheduler 的 addJobListener() 方法;注册为全局监听器,要调用 addGlobalJobListener() 方法。
l 使用job监听器,使用Scheduler 注册它,指定JobDetail实例相关联。当指定任务执行时,会得到相应的通知。
l 请看JobListener的API
public void jobToBeExecuted(JobExecutionContext context)
当JobDetail将要执行时(关联的触发器已经触发),被排程调用。如果监听器否决了执行,则本方法不被调用。
public void jobExecutionVetoed(JobExecutionContext context)
当JobDetail将要执行(关联的触发器已经触发),但是触发器否决了执行时,被排程调用。
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException)
在JobDetail执行后,关联的触发器triggered(xx)方法调用前,被排程调用。
l 控制台的输出
------- 启动排程 ----------------
[DEBUG] 26 九月 02:46:45.525 下午 DefaultQuartzScheduler_QuartzSchedulerThread [org.quartz.simpl.SimpleJobFactory]
Producing instance of Job ’group1.job1’, class=com.zbaccp.quartz.cl.example9.SimpleJob1
[INFO] 26 九月 02:46:45.535 下午 DefaultQuartzScheduler_Worker-1 [com.zbaccp.quartz.cl.example9.Job1Listener]
任务1监听器说: 任务将要被执行。
[DEBUG] 26 九月 02:46:45.535 下午 DefaultQuartzScheduler_Worker-1 [org.quartz.core.JobRunShell]
Calling execute on job group1.job1
[INFO] 26 九月 02:46:45.545 下午 DefaultQuartzScheduler_Worker-1 [com.zbaccp.quartz.cl.example9.SimpleJob1]
简单任务1说话了: group1.job1 运行时刻: Tue Sep 26 14:46:45 CST 2006
[INFO] 26 九月 02:46:45.545 下午 DefaultQuartzScheduler_Worker-1 [com.zbaccp.quartz.cl.example9.Job1Listener]
任务1监听器说: 任务执行结束。
文件下载:quartzOfficial9