《Java 项目中使用单线程 实现 Quartz-2.2.1 触发优先级》
本示例将演示如何使用触发器优先级来管理具有相同触发时间的触发器的触发顺序。
该示例将执行以下操作:
用一个工作线程创建一个调度程序;
安排三个不同优先级的触发器,第一次同时触发,第二次以错开的时间间隔触发;
启动Quartz Scheduler;
等待30秒让 Job 有机会触发触发器;
关闭调度程序;
本示例参考了官网相关 API :
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html
Job :
package com.etc.clear.mail.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 邮件发送任务
* <p>
*
* @ClassName : SendMailJob
* </p>
* <p>
* @Description : TODO
* </p>
* <p>
* @Author : HuaZai
* </p>
* <p>
* @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com
* </p>
*
* @Date : 2018年1月12日 下午2:34:54
* @Version : V1.0.0
*
*/
public class SendMailByJob implements Job {
private static final Logger log = LoggerFactory.getLogger(SendMailByJob.class);
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
log.info("--------------- 执行发送邮件任务 :" + context.getTrigger().getKey());
}
}
Utils :
package com.etc.clear.mail.utils;
import java.util.Date;
import org.quartz.DateBuilder;
import org.quartz.DateBuilder.IntervalUnit;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 邮件任务调度工具类(触发优先级)
* <p>
*
* @ClassName : MailQuartzUtils
* </p>
* <p>
* @Description : TODO
* </p>
* <p>
* @Author : HuaZai
* </p>
* <p>
* @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com
* </p>
*
* @Date : 2018年1月12日 下午2:54:14
* @Version : V1.0.0
*
*/
public class MailQuartzUtils {
// 定义变量
private static final String JOB_GROUP_NAME = "JOB_MAILJOBGROUP_NAME"; // 任务组
private static final String TRIGGER_GROUP_NAME = "TRIGGER_MAILTRIGGERGROUP_NAME"; // 触发器组
private static final Logger log = LoggerFactory.getLogger(MailQuartzUtils.class);
/**
* 创建 SimpleTrigger
* <p>
*
* @Title : addJobBySimple
* </p>
* <p>
* @Description : TODO
* </p>
* <p>
* @Author : HuaZai
* </p>
*
* @throws Exception
* @Date : 2018年1月12日 下午2:58:40
*/
public static void addJobBySimple(String jobName, String triggerName, Class<? extends Job> jobClass, Integer second)
throws Exception {
log.info("--------------- 正在初始化 ---------------");
// 获得调度器的调用
SchedulerFactory factory = new StdSchedulerFactory("resource/quartz_priority.properties");
Scheduler scheduler = factory.getScheduler();
log.info("--------------- 初始化完成 ---------------");
log.info("--------------- 开始任务调度 ---------------");
// 构建一个jobDetail 作业实例
JobDetail detail = JobBuilder.newJob(jobClass)// 构建一个新任务
.withIdentity(jobName, JOB_GROUP_NAME)// 给新任务起名和分组
.build();// 绑定作业
// 从现在开始计算所有触发器的启动时间
Date startTime = DateBuilder.futureDate(5, IntervalUnit.SECOND);
// 第一个触发器的优先级为1,并在10秒后重复
Trigger trigger01 = TriggerBuilder.newTrigger() // 创建一个新的TriggerBuilder
.withIdentity("--------------- 触发优先级:第一级-> 间隔 10 秒一次,重复两次", TRIGGER_GROUP_NAME) // 给触发器分组
.startAt(startTime) // 在指定时间执行
.withSchedule(
// 定义触发规则
SimpleScheduleBuilder.simpleSchedule().withRepeatCount(1) // 重复次数
.withIntervalInSeconds(10) // 时间间隔
).withPriority(1) // 先同一线程中的优先级
.forJob(detail) // 指定任务实例
.build();
// 第二个触发器的缺省优先级为5(默认),并在20秒后重复
Trigger trigger02 = TriggerBuilder.newTrigger() // 创建一个新的TriggerBuilder
.withIdentity("--------------- 触发优先级:第二级-> 间隔 20 秒一次,重复两次", TRIGGER_GROUP_NAME) // 给触发器分组
.startAt(startTime) // 在指定时间执行
.withSchedule(
// 定义触发规则
SimpleScheduleBuilder.simpleSchedule().withRepeatCount(1) // 重复次数
.withIntervalInSeconds(20) // 时间间隔
).forJob(detail) // 指定任务实例
.build();
// 第三个触发器具有优先级10,并在30秒后重复
Trigger trigger03 = TriggerBuilder.newTrigger() // 创建一个新的TriggerBuilder
.withIdentity("--------------- 触发优先级:第三级-> 间隔 30 秒一次,重复两次", TRIGGER_GROUP_NAME) // 给触发器分组
.startAt(startTime) // 在指定时间执行
.withSchedule(
// 定义触发规则
SimpleScheduleBuilder.simpleSchedule().withRepeatCount(1) // 重复次数
.withIntervalInSeconds(30) // 时间间隔
).withPriority(10) // 先同一线程中的优先级
.forJob(detail) // 指定任务实例
.build();
// 让quartz使用指定的触发器来调用任务
scheduler.scheduleJob(detail, trigger01);
scheduler.scheduleJob(trigger02);
scheduler.scheduleJob(trigger03);
// 启动调度器(在调度器启动之前,什么都不能运行)
scheduler.start();
log.info("--------------- 开始调度器 ---------------");
// 等待时间足够长,这样调度程序就可以触发触发器
log.info("--------------- 等待60秒…… ---------------");
try {
Thread.sleep(60L * 1000L);
} catch (Exception e) {
e.printStackTrace();
}
// 关闭调度器
log.info("--------------- 关闭开始 ---------------");
scheduler.shutdown(true);
log.info("--------------- 关闭完成 ---------------");
}
}
Commons :
package com.etc.clear.mail.common;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.etc.clear.mail.job.SendMailByJob;
import com.etc.clear.mail.utils.MailQuartzUtils;
/**
* 初始化 mail 邮件发送任务
* <p>
*
* @ClassName : InitMailQuartzCommon
* </p>
* <p>
* @Description : TODO
* </p>
* <p>
* @Author : HuaZai
* </p>
* <p>
* @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com
* </p>
*
* @Date : 2018年1月12日 下午4:05:05
* @Version : V1.0.0
*
*/
public class InitMailQuartzCommon {
private static final String JOB_NAME = "SendMailByJob";
private static final String TRIGGER_NAME = "SendMailByTrigger";
private static final Logger log = LoggerFactory.getLogger(InitMailQuartzCommon.class);
public void startSendMail() {
try {
log.info("--------------- 开始任务 ---------------");
MailQuartzUtils.addJobBySimple(JOB_NAME, TRIGGER_NAME, SendMailByJob.class, 5);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Main :
package com.etc.clear;
import com.etc.clear.mail.common.InitMailQuartzCommon;
/**
* 程序启动入口/调用任务的类
* <p>
*
* @ClassName : ClsMain
* </p>
* <p>
* @Description : TODO
* </p>
* <p>
* @Author : HuaZai
* </p>
* <p>
* @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com
* </p>
*
* @Date : 2018年1月3日 下午1:21:56
*
* @Version : V1.0.0
*
*/
public class ApplicationMain {
public static void main(String[] args) {
// 初始化邮件发送任务
InitMailQuartzCommon mailQuartzCommon = new InitMailQuartzCommon();
// 启动邮件发送任务
mailQuartzCommon.startSendMail();
}
}
Properties :
## 定义 Quartz 任务调度器的调用优先级
org.quartz.scheduler.instanceName=PriorityExampleScheduler
## 将线程数设置为1,以便在同一时间内强制触发触发器
## 按优先顺序排序
org.quartz.threadPool.threadCount=1
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
运行结果如下图:
本实例源码下载地址:
http://download.youkuaiyun.com/download/hello_world_qwp/10208359