赞
踩

/**
* @Author: zkfgyzy@163.com
* @Date: 2022/1/6 22:05
*/
public class HelloJob implements Job {
public HelloJob(){
System.out.println("我是HelloJob");
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//输出当前时间的job
Date date = new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = simpleDateFormat.format(date);
System.out.println("正在进行数据库的备份工作,备份数据库的时间是:"+dateString);
}
}
/**
* @Author: zkfgyzy@163.com
* @Date: 2022/1/6 22:09
*/
public class HelloSchedulerDemo {
public static void main(String[] args) throws SchedulerException {
//1:调度器(Scheduler),从工厂中获取调度实例,默认是实例化了new StdSchedulerFactory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//2:任务实例(JobDetail)
//加载任务类,与HelloJob完成绑定,要求HelloJob实现Job接口
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
//参数1:任务的名称,(唯一实例)。参数2:任务组的名称
.withIdentity("job1", "group1")
.build();
//3:触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
//参数1:触发器名称,触发器组的名称
.withIdentity("trigger1", "group1")
.startNow()//马上启动
//每5秒重复执行一次
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(5))
.build();
//4. 使用调度器将触发器和任务jobdetail关联
scheduler.scheduleJob(jobDetail,trigger);
//5. 启动触发器
scheduler.start();
}
}
1、创建调度器
2、将要执行的程序作为job,放入jobDetail中。job只是定义的一个死任务,jobDetail才是要被触发器执行的任务,jobDetail类似一个包装类,有更多的方法去处理job
3、定义触发器,触发器用来触发任务的,因此触发器包含更多的功能,例如每隔多长时间去执行任务等
4、调度器:调度器用于JobDetail和Trigger的整合,比如:调度器A和那个JobDetail进行匹配,此外,调度器是整个任务的启动按钮
JobDetail job = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1", "group1") // 定义该实例唯一标识,并指定一个组。
.build();
System.out.println("name:"+job.getKey().getName());
System.out.println("group:"+job.getKey().getGroup());
System.out.println("jobClass:"+job.getJobClass().getName());
/**
* @Author: zkfgyzy@163.com
* @Date: 2022/1/6 22:05
*/
public class HelloJob implements Job {
public HelloJob(){
System.out.println("我是HelloJob");
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//输出当前时间的job
Date date = new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = simpleDateFormat.format(date);
JobKey key = jobExecutionContext.getJobDetail().getKey();
System.out.println("工作任务名称:"+key.getName()+" "+"工作内容组:"+key.getGroup());
System.out.println("任务类名称(带路径):"+jobExecutionContext.getJobDetail().getJobClass().getName());
System.out.println("任务类的名称: "+jobExecutionContext.getJobDetail().getJobClass().getSimpleName());
System.out.println("正在进行数据库的备份工作,备份数据库的时间是:"+dateString);
}
}
name:job1
group:group1
jobClass:net.toposphere.quartz.springbootquartz.job.HelloJob
我是HelloJob
工作任务名称:job1 工作内容组:group1
任务类名称(带路径):net.toposphere.quartz.springbootquartz.job.HelloJob
任务类的名称: HelloJob
正在进行数据库的备份工作,备份数据库的时间是:2022-01-13 01:44:34
我是HelloJob
工作任务名称:job1 工作内容组:group1
任务类名称(带路径):net.toposphere.quartz.springbootquartz.job.HelloJob
任务类的名称: HelloJob
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
//参数1:任务的名称,(唯一实例)。参数2:任务组的名称
.withIdentity("job1", "group1")
.usingJobData("message","打印JobDetail日志")
.build();
System.out.println("name:"+jobDetail.getKey().getName());
System.out.println("group:"+jobDetail.getKey().getGroup());
System.out.println("jobClass:"+jobDetail.getJobClass().getName());
//3:触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
//参数1:触发器名称,触发器组的名称
.withIdentity("trigger1", "group1")
.startNow()//马上启动
//每5秒重复执行一次
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(5))
.usingJobData("message","打印Trigger日志")
.build();
/**
* @Author: zkfgyzy@163.com
* @Date: 2022/1/6 22:05
*/
public class HelloJob implements Job {
public HelloJob(){
System.out.println("我是HelloJob");
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//输出当前时间的job
Date date = new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = simpleDateFormat.format(date);
JobKey key = jobExecutionContext.getJobDetail().getKey();
System.out.println("工作任务名称:"+key.getName()+" "+"工作内容组:"+key.getGroup());
System.out.println("任务类名称(带路径):"+jobExecutionContext.getJobDetail().getJobClass().getName());
System.out.println("任务类的名称: "+jobExecutionContext.getJobDetail().getJobClass().getSimpleName());
System.out.println("正在进行数据库的备份工作,备份数据库的时间是:"+dateString);
//TODO 此处获取jobDataMap
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
String message = jobDataMap.getString("message");
System.out.println(message);
JobDataMap jobDataMap1 = jobExecutionContext.getTrigger().getJobDataMap();
String message1 = jobDataMap1.getString("message");
System.out.println(message1);
}
}
//获取其他内容
System.out.println("当前任务的执行时间:"+jobExecutionContext.getFireTime());
System.out.println("下次任务的执行时间:"+jobExecutionContext.getNextFireTime());
public class HelloJob implements Job {
private String message;
public void setMessage(String message) {
this.message = message;
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(message);
}
}
JobDetail job = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1", "group1") // 定义该实例唯一标识
.usingJobData("message", "打印日志")
.usingJobData("count", 0)
.build();
//添加count的setting和getting方法。
private Integer count;
public void setCount(Integer count) {
this.count = count;
}
//执行execute()方法中累加count
++count;
System.out.println("count数量:"+count);
context.getJobDetail().getJobDataMap().put("count", count);

// 调度类
public class HelloSchedulerDemoTrigger {
public static void main(String[] args) throws SchedulerException {
//1:调度器(Scheduler),从工厂中获取调度实例,默认是实例化了new StdSchedulerFactory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//开始时间
Date startDate = new Date();
startDate.setTime(startDate.getTime()+3000);
//结束时间
Date endDate = new Date();
endDate.setTime(endDate.getTime()+10000);
//2:任务实例(JobDetail)
//加载任务类,与HelloJob完成绑定,要求HelloJob实现Job接口
JobDetail jobDetail = JobBuilder.newJob(HelloJobTrigger.class)
//参数1:任务的名称,(唯一实例)。参数2:任务组的名称
.withIdentity("job1", "group1")
.usingJobData("message","打印JobDetail日志")
.usingJobData("count",0)
.build();
//3:触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
//参数1:触发器名称,触发器组的名称
.withIdentity("trigger1", "group1")
//.startNow()//马上启动
//每5秒重复执行一次,如果没有下面这个,表示立即执行,且执行一次
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(5))
//指定时间启动
.startAt(startDate)
//设置任务的结束触发时间
.endAt(endDate)
.usingJobData("message","打印Trigger日志")
.build();
//4. 使用调度器将触发器和任务jobdetail关联
scheduler.scheduleJob(jobDetail,trigger);
//5. 启动触发器
scheduler.start();
}
}
public class HelloJobTrigger implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//输出当前时间的job
Date date = new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = simpleDateFormat.format(date);
System.out.println("正在进行数据库备份工作,备份数据库的时间是"+dateString);
//获取jobkey,startTime,endTime
Trigger trigger = jobExecutionContext.getTrigger();
System.out.println("jobkey的名称"+trigger.getJobKey().getName()+" ;job的组名"+trigger.getJobKey().getGroup());
System.out.println("jobkey的开始时间"+simpleDateFormat.format(trigger.getStartTime())+" ;jobkey的结束时间"+simpleDateFormat.format(trigger.getEndTime()));
}
}
// 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1") // 定义该实例唯一标识
.startAt(startDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)
.withRepeatCount(2)) // 每5秒执行一次,连续执行3次后停止,默认值是0
.build();
1、Seconds 秒
2、Minutes 分钟
3、Hours 小时
4、Day-of-Month 月中的天
5、Month 月
6、Day-of-Week 周中的天
7、Year (optional field) 年(可选的域)----这个可以省略


"0 0 10,14,16 * * ?" 每天上午10点,下午2点,4点
"0 0/30 9-17 * * ?" 朝九晚五工作时间内每半小时,从0分开始每隔30分钟发送一次
"0 0 12 ? * WED" 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/55 14 * * ?" 在每天下午2点到下午2:55期间,从0开始到55分钟触发
"0 0/55 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的,从0开始到55分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
// 定义任务类
public class HelloJobCronTrigger implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 定义时间
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = dateFormat.format(date);
// 定义工作任务内容
System.out.println("进行数据库备份操作。当前任务执行的时间:"+dateString);
}
}
public class HelloSchedulerDemoCronTrigger {
public static void main(String[] args) throws Exception {
// 1:从工厂中获取任务调度的实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2:定义一个任务调度实例,将该实例与HelloJob绑定,任务类需要实现Job接口
JobDetail job = JobBuilder.newJob(HelloJobCronTrigger.class)
.withIdentity("job1", "group1") // 定义该实例唯一标识
.build();
// 3:定义触发器 ,马上执行, 然后每5秒重复执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1") // 定义该实例唯一标识
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * 6 4 ?"))// 定义表达式
.build();
// 4:使用触发器调度任务的执行
scheduler.scheduleJob(job, trigger);
// 5:开启
scheduler.start();
// 关闭
// scheduler.shutdown();
}
}
1、‘L’和‘W’可以一起使用。(企业可用在工资计算)
2、‘#’可表示月中第几个周几。(企业可用在计算母亲节和父亲节)
3、周字段英文字母不区分大小写,例如MON==mon。
4、利用工具,在线生成。
所有的Scheduler实例由SchedulerFactory创建

Quartz默认的SchedulerFactory
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
public class HelloSchedulerDemoScheduler {
public static void main(String[] args) throws SchedulerException {
//1:调度器(Scheduler),从工厂中获取调度实例,默认是实例化了new StdSchedulerFactory
//Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
StdSchedulerFactory stdSchedulerFactory=new StdSchedulerFactory();
Scheduler scheduler=stdSchedulerFactory.getScheduler();
//2:任务实例(JobDetail)
//加载任务类,与HelloJob完成绑定,要求HelloJob实现Job接口
JobDetail jobDetail = JobBuilder.newJob(HelloJobScheduler.class)
//参数1:任务的名称,(唯一实例)。参数2:任务组的名称
.withIdentity("job1", "group1")
.usingJobData("message","打印JobDetail日志")
.usingJobData("count",0)
.build();
//3:触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
//参数1:触发器名称,触发器组的名称
.withIdentity("trigger1", "group1")
//.startNow()//马上启动
//使用日历触发器
.withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
// .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(5))
//指定时间启动
.usingJobData("message","打印Trigger日志")
.build();
//4. 使用调度器将触发器和任务jobdetail关联
Date date = scheduler.scheduleJob(jobDetail, trigger);
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("调度器开始调度时间"+dateFormat.format(date));
//5. 启动触发器
scheduler.start();
}
}
//5. 启动触发器
scheduler.start();
// Scheduler执行2秒后自动挂起
Thread.sleep(2000L);
scheduler.standby();
// Scheduler执行5秒后自动开启
Thread.sleep(5000L);
scheduler.start();
shutdown(true):表示等待所有正在执行的job执行完毕之后,再关闭Scheduler;
shutdown(false):表示直接关闭Scheduler
DirectSchedulerFactory directSchedulerFactory = DirectSchedulerFactory.getInstance();
Scheduler scheduler = directSchedulerFactory.getScheduler();
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
调度器部分
org.quartz.scheduler.instanceName属性用来区分特定的调度器实例,可以按照功能用途来给调度器起名。
org.quartz.scheduler.instanceId属性和前者一样,也允许任何字符串,但这个值必须在所有调度器实例中是唯一的,尤其是在一个集群环境中,作为集群的唯一key。假如你想Quartz帮你生成这个值的话,可以设置为AUTO。
线程池属性
作业调度设置
Quartz的插件设置
#===============================================================
#Configure Main Scheduler Properties 调度器属性
#===============================================================
#调度器的实例名
org.quartz.scheduler.instanceName = QuartzScheduler
#调度器的实例ID,大多数情况设置为auto即可
org.quartz.scheduler.instanceId = AUTO
#===============================================================
#Configure ThreadPool 线程池属性
#===============================================================
#处理Job的线程个数,至少为1,但最多的话最好不要超过100,在多数机器上设置该值超过100的话就会显得相当不实用了,特别是在你的 Job 执行时间较长的情况下
org.quartz.threadPool.threadCount = 5
#线程的优先级,优先级别高的线程比级别低的线程优先得到执行。最小为1,最大为10,默认为5
org.quartz.threadPool.threadPriority = 5
#一个实现了 org.quartz.spi.ThreadPool 接口的类,Quartz 自带的线程池实现类是 org.quartz.smpl.SimpleThreadPool
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#===============================================================
#Configure JobStore 作业存储设置
#===============================================================
#要使 Job 存储在内存中需通过设置 org.quartz.jobStrore.class 属性为 org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#===============================================================
#Configure Plugins 插件配置
#===============================================================
org.quartz.plugin.jobInitializer.class =
org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.validating=false
也可以编写程序代码操作quartz.properties文件的内容:
public class QuartzProperties {
public static void main(String[] args) {
// 创建工厂实例
StdSchedulerFactory factory = new StdSchedulerFactory();
// 创建配置工厂的属性对象
Properties props = new Properties();
props.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS, "org.quartz.simpl.SimpleThreadPool"); // 线程池定义
props.put("org.quartz.threadPool.threadCount", "5"); // 默认Scheduler的线程数
try {
// 使用定义的属性初始化工厂
factory.initialize(props);
Scheduler scheduler = factory.getScheduler();
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
通过Properties设置工厂属性的缺点在用硬编码,假如需要修改例子中线程数量,将不得不修改代码,然后重新编译。我们这里不推荐使用。
全局监听器能够接收到所有的Job/Trigger的事件通知,
非全局监听器只能接收到在其上注册的Job或Trigger的事件,不在其上注册的Job或Trigger则不会进行监听。
public interface JobListener {
String getName();
void jobToBeExecuted(JobExecutionContext var1);
void jobExecutionVetoed(JobExecutionContext var1);
void jobWasExecuted(JobExecutionContext var1, JobExecutionException var2);
}
- getName方法:用于获取该JobListener的名称。
- jobToBeExecuted方法:Scheduler在JobDetail将要被执行时调用这个方法。
- jobExecutionVetoed方法:Scheduler在JobDetail即将被执行,但又被TriggerListerner否决时会调用该方法
- jobWasExecuted方法:Scheduler在JobDetail被执行之后调用这个方法
public class HelloJobListener implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//输出当前时间的job
Date date = new Date();
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = simpleDateFormat.format(date);
System.out.println("正在进行数据库备份工作,备份数据库的时间是"+dateString);
}
}
public class MyListener implements JobListener {
@Override
public String getName() {
String simpleName = this.getClass().getSimpleName();
System.out.println("监听器的名称是:"+simpleName);
return simpleName;
}
@Override
public void jobToBeExecuted(JobExecutionContext jobExecutionContext) {
String name = jobExecutionContext.getJobDetail().getKey().getName();
System.out.println("Scheduler在jobDetail将要被执行时调用的方法"+name);
}
@Override
public void jobExecutionVetoed(JobExecutionContext jobExecutionContext) {
String name = jobExecutionContext.getJobDetail().getKey().getName();
System.out.println("job将要被执行,但是又被trigger否决时执行的方法:"+name);
}
@Override
public void jobWasExecuted(JobExecutionContext jobExecutionContext, JobExecutionException e) {
String name = jobExecutionContext.getJobDetail().getKey().getName();
System.out.println("job被执行后调用的方法:"+name);
}
}
public class HelloSchedulerDemoListener {
public static void main(String[] args) throws SchedulerException {
//1:调度器(Scheduler),从工厂中获取调度实例,默认是实例化了new StdSchedulerFactory
//Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
StdSchedulerFactory stdSchedulerFactory=new StdSchedulerFactory();
Scheduler scheduler=stdSchedulerFactory.getScheduler();
//2:任务实例(JobDetail)
//加载任务类,与HelloJob完成绑定,要求HelloJob实现Job接口
JobDetail jobDetail = JobBuilder.newJob(HelloJobListener.class)
//参数1:任务的名称,(唯一实例)。参数2:任务组的名称
.withIdentity("job1", "group1")
.usingJobData("message","打印JobDetail日志")
.usingJobData("count",0)
.build();
//3:触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
//参数1:触发器名称,触发器组的名称
.withIdentity("trigger1", "group1")
.startNow()//马上启动
//使用日历触发器
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
// .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(5))
//指定时间启动
.usingJobData("message","打印Trigger日志")
.build();
//4. 使用调度器将触发器和任务jobdetail关联
Date date = scheduler.scheduleJob(jobDetail, trigger);
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("调度器开始调度时间"+dateFormat.format(date));
// 6. 创建并注册一个全局的Job Listener
//scheduler.getListenerManager().addJobListener(new MyListener(), EverythingMatcher.allJobs());
//7. 创建一个局部的Job Listener 所谓的局部就是指定的job
scheduler.getListenerManager().addJobListener(new MyListener(), KeyMatcher.keyEquals(JobKey.jobKey("job1","group1")));
//5. 启动触发器
scheduler.start();
}
}
public interface TriggerListener {
public String getName();
public void triggerFired(Trigger trigger, JobExecutionContext context);
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);
public void triggerMisfired(Trigger trigger);
public void triggerComplete(Trigger trigger, JobExecutionContext context,
int triggerInstructionCode);
}
- getName方法:用于获取触发器的名称
- triggerFired方法:当与监听器相关联的Trigger被触发,Job上的execute()方法将被执行时,Scheduler就调用该方法。
- vetoJobExecution方法:在 Trigger 触发后,Job 将要被执行时由 Scheduler 调用这个方法。TriggerListener 给了一个选择去否决 Job 的执行。假如这个方法返回 true,这个 Job 将不会为此次 Trigger 触发而得到执行。
- triggerMisfired方法:Scheduler 调用这个方法是在 Trigger 错过触发时。你应该关注此方法中持续时间长的逻辑:在出现许多错过触发的 Trigger 时,长逻辑会导致骨牌效应。你应当保持这上方法尽量的小。
- triggerComplete方法:Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个方法。
public class MyTriggerListener implements TriggerListener {
private String name;
public MyTriggerListener(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public void triggerFired(Trigger trigger, JobExecutionContext context) {
String triggerName = trigger.getKey().getName();
System.out.println(triggerName + " 被触发");
}
@Override
public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
String triggerName = trigger.getKey().getName();
System.out.println(triggerName + " 没有被触发");
return true; // true:表示不会执行Job的方法
}
@Override
public void triggerMisfired(Trigger trigger) {
String triggerName = trigger.getKey().getName();
System.out.println(triggerName + " 错过触发");
}
@Override
public void triggerComplete(Trigger trigger, JobExecutionContext context,
Trigger.CompletedExecutionInstruction triggerInstructionCode) {
String triggerName = trigger.getKey().getName();
System.out.println(triggerName + " 完成之后触发");
}
}
public class HelloSchedulerDemoListener {
public static void main(String[] args) throws SchedulerException {
//1:调度器(Scheduler),从工厂中获取调度实例,默认是实例化了new StdSchedulerFactory
//Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
StdSchedulerFactory stdSchedulerFactory=new StdSchedulerFactory();
Scheduler scheduler=stdSchedulerFactory.getScheduler();
//2:任务实例(JobDetail)
//加载任务类,与HelloJob完成绑定,要求HelloJob实现Job接口
JobDetail jobDetail = JobBuilder.newJob(HelloJobListener.class)
//参数1:任务的名称,(唯一实例)。参数2:任务组的名称
.withIdentity("job1", "group1")
.usingJobData("message","打印JobDetail日志")
.usingJobData("count",0)
.build();
//3:触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
//参数1:触发器名称,触发器组的名称
.withIdentity("trigger1", "group1")
.startNow()//马上启动
//使用日历触发器
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
// .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(5))
//指定时间启动
.usingJobData("message","打印Trigger日志")
.build();
//4. 使用调度器将触发器和任务jobdetail关联
Date date = scheduler.scheduleJob(jobDetail, trigger);
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("调度器开始调度时间"+dateFormat.format(date));
// 6. 创建并注册一个全局的Job Listener
//scheduler.getListenerManager().addJobListener(new MyListener(), EverythingMatcher.allJobs());
//7. 创建一个局部的Job Listener 所谓的局部就是指定的job
// scheduler.getListenerManager().addJobListener(new MyListener(), KeyMatcher.keyEquals(JobKey.jobKey("job1","group1")));
// 8. 创建并注册一个全局的Trigger Listener
scheduler.getListenerManager().addTriggerListener(new MyTriggerListener("simpleTrigger"), EverythingMatcher.allTriggers());
// 9. 创建并注册一个局部的Trigger Listener
// scheduler.getListenerManager().addTriggerListener(new MyTriggerListener("simpleTrigger"), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1", "group1")));
//5. 启动触发器
scheduler.start();
}
}
public interface SchedulerListener {
public void jobScheduled(Trigger trigger);
public void jobUnscheduled(String triggerName, String triggerGroup);
public void triggerFinalized(Trigger trigger);
public void triggersPaused(String triggerName, String triggerGroup);
public void triggersResumed(String triggerName, String triggerGroup);
public void jobsPaused(String jobName, String jobGroup);
public void jobsResumed(String jobName, String jobGroup);
public void schedulerError(String msg, SchedulerException cause);
public void schedulerStarted();
public void schedulerInStandbyMode();
public void schedulerShutdown();
public void schedulingDataCleared();
}
其中:
- jobScheduled方法:用于部署JobDetail时调用
- jobUnscheduled方法:用于卸载JobDetail时调用
- triggerFinalized方法:当一个 Trigger 来到了再也不会触发的状态时调用这个方法。除非这个 Job 已设置成了持久性,否则它就会从 Scheduler 中移除。
- triggersPaused方法:Scheduler 调用这个方法是发生在一个 Trigger 或 Trigger 组被暂停时。假如是 Trigger 组的话,triggerName 参数将为 null。
- triggersResumed方法:Scheduler 调用这个方法是发生成一个 Trigger 或 Trigger 组从暂停中恢复时。假如是 Trigger 组的话,假如是 Trigger 组的话,triggerName 参数将为 null。参数将为 null。
- jobsPaused方法:当一个或一组 JobDetail 暂停时调用这个方法。
- jobsResumed方法:当一个或一组 Job 从暂停上恢复时调用这个方法。假如是一个 Job 组,jobName 参数将为 null。
- schedulerError方法:在 Scheduler 的正常运行期间产生一个严重错误时调用这个方法。
- schedulerStarted方法:当Scheduler 开启时,调用该方法
- schedulerInStandbyMode方法: 当Scheduler处于StandBy模式时,调用该方法
- schedulerShutdown方法:当Scheduler停止时,调用该方法
- schedulingDataCleared方法:当Scheduler中的数据被清除时,调用该方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。