package com.zbaccp.quartz.cl.example14;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 一个简单的job,打印触发job的触发器名称
*
* @author 林艺
*/
public class TriggerEchoJob implements Job {
private static final Log LOG = LogFactory.getLog(TriggerEchoJob.class);
/**
* 默认构造函数
*/
public TriggerEchoJob() {
}
/**
* 打印触发job的触发器名称
*/
public void execute(JobExecutionContext context)
throws JobExecutionException {
LOG.info("=========TRIGGER名称: " + context.getTrigger().getName());
}
}
package com.zbaccp.quartz.cl.example14;
import java.util.Calendar;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
/**
* 本范例演示,当Trigger同时触发的时候,如何使用Trigger优先级来管理触发顺序。
* 3个触发器的优先级分别是-5,5,10。很显然争用线程资源的时候,优先级为10的触发器优先触发。
*/
public class PriorityExample {
public void run() throws Exception {
Log log = LogFactory.getLog(PriorityExample.class);
log.info("------- Initializing ----------------------");
//1 创建排程工厂,并且使用properties初始化
SchedulerFactory sf = new StdSchedulerFactory("quartz_priority.properties");
Scheduler sched = sf.getScheduler();
log.info("------- Initialization Complete -----------");
log.info("------- Scheduling Jobs -------------------");
JobDetail job = new JobDetail("TriggerEchoJob", null, TriggerEchoJob.class);
//第1次的时候,3个触发器将同时触发,根据优先级运行。第2次的时候,执行顺序已经叉开,因此与优先级无关。
// 我们将看到如下的触发顺序:
// 1. Priority10Trigger15SecondRepeat
// 2. Priority5Trigger10SecondRepeat
// 3. PriorityNeg5Trigger5SecondRepeat
// 4. PriorityNeg5Trigger5SecondRepeat
// 5. Priority5Trigger10SecondRepeat
// 6. Priority10Trigger15SecondRepeat
//2 设定第1次触发的时间
Calendar startTime = Calendar.getInstance();
startTime.add(Calendar.SECOND, 5);
//2.1 触发器1,优先级-5,触发间隔5秒
SimpleTrigger trigger1 =
new SimpleTrigger("PriorityNeg5 Trigger5SecondRepeat", null, startTime.getTime(), null, 1, 5L * 1000L);
trigger1.setPriority(-5);
trigger1.setJobName("TriggerEchoJob");
//2.2触发器2,优先级5,触发间隔10秒
SimpleTrigger trigger2 =
new SimpleTrigger("Priority5 Trigger10SecondRepeat", null, startTime.getTime(), null, 1, 10L * 1000L);
trigger1.setPriority(5);
trigger2.setJobName("TriggerEchoJob");
//2.3 触发器3,优先级10,触发间隔15秒
SimpleTrigger trigger3 =
new SimpleTrigger("Priority10 Trigger15SecondRepeat", null, startTime.getTime(), null, 1, 15L * 1000L);
trigger3.setPriority(10);
trigger3.setJobName("TriggerEchoJob");
//3 预安排job
sched.scheduleJob(job, trigger1);
sched.scheduleJob(trigger2);
sched.scheduleJob(trigger3);
sched.start();
log.info("------- Started Scheduler -----------------");
//4 等待30秒钟,等待所有的job运行结束
log.info("------- Waiting 30 seconds... -------------");
try {
Thread.sleep(30L * 1000L);
// executing...
} catch (Exception e) {
}
//5 关闭scheduler
log.info("------- Shutting Down ---------------------");
sched.shutdown(true);
log.info("------- Shutdown Complete -----------------");
}
public static void main(String[] args) throws Exception {
PriorityExample example = new PriorityExample();
example.run();
}
}