任务类

 package org.quartz.examples.example2;

 import java.util.Date;

 import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey; /**
* 任务job
*/
public class SimpleJob implements Job { private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class); // 必须要有public修饰的无参构造函数
public SimpleJob() {
} // 任务执行方法
public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey jobKey = context.getJobDetail().getKey();  //jobKey长这样:group1.job6
LOG.info("执行任务。SimpleJob says: " + jobKey + " executing at " + new Date());
} }

调度管理类

package org.quartz.examples.example2;

import static org.quartz.DateBuilder.futureDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.JobKey.jobKey;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.DateBuilder;
import org.quartz.DateBuilder.IntervalUnit;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.Date; /**
* 这个例子表明,只要触发器运用的好,job任务可以被花式执行
*/
public class SimpleTriggerExample {
Logger LOG = LoggerFactory.getLogger(SimpleTriggerExample.class); public void run() throws Exception { // 初始化一个调度工厂,并实例化一个调度类
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
// 第一个参数:null就是默认当前时间,也可以指定时间
// 第二个参数:把一分钟按15进行划分,也就是60/15等份。
// 举例:当前时间是10:26:04,那么startTime就是10:26:15。当前时间是10:26:31,那么startTime就是10:26:45。
Date startTime = DateBuilder.nextGivenSecondDate(null, 15); // ========================================================
// ============ job1 任务绑定到group1 组中 ==================
// ========================================================
JobDetail job = newJob(SimpleJob.class).withIdentity("job1", "group1").build();
// 实例化一个触发器,命名为trigger1,并绑定到一个名为group1的组中,Job类运行开始时间为runTime(下一分钟)
SimpleTrigger trigger = (SimpleTrigger) newTrigger().withIdentity("trigger1", "group1").startAt(startTime)
.build();
Date date = scheduler.scheduleJob(job, trigger);
LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds"); // ========================================================
// ============ job2 任务绑定到group1 组中 ==================
// ========================================================
job = newJob(SimpleJob.class).withIdentity("job2", "group1").build();
trigger = (SimpleTrigger) newTrigger().withIdentity("trigger2", "group1").startAt(startTime).build();
date = scheduler.scheduleJob(job, trigger);
LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds"); // ====================================================================
// ============ job3 任务绑定到group1 组中,运行一次每间隔10秒重复1次,总共重复10次
// ====================================================================
job = newJob(SimpleJob.class).withIdentity("job3", "group1").build();
trigger = newTrigger().withIdentity("trigger3", "group1").startAt(startTime)
.withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
date = scheduler.scheduleJob(job, trigger);
LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds");
// ====================================================================
// ============ job3 任务绑定到group2 组中,将被另一个触发器调度,这一次将以70秒的间隔重复两次
// ====================================================================
trigger = newTrigger().withIdentity("trigger3", "group2").startAt(startTime)
.withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(2)).forJob(job).build(); date = scheduler.scheduleJob(trigger);
LOG.info(job.getKey() + " will [also] run at: " + date + " and repeat: " + trigger.getRepeatCount()
+ " times, every " + trigger.getRepeatInterval() / 1000 + " seconds"); // ====================================================================
// ============ job4 将被执行6次,执行一次重复5次,每次间隔10秒
// ====================================================================
job = newJob(SimpleJob.class).withIdentity("job4", "group1").build();
trigger = newTrigger().withIdentity("trigger4", "group1").startAt(startTime)
.withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5)).build();
date = scheduler.scheduleJob(job, trigger);
LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds"); // ====================================================================
// ============ job5 将在5分钟后执行一次
// ====================================================================
job = newJob(SimpleJob.class).withIdentity("job5", "group1").build();
trigger = (SimpleTrigger) newTrigger().withIdentity("trigger5", "group1")
.startAt(futureDate(5, IntervalUnit.MINUTE)).build();
date = scheduler.scheduleJob(job, trigger);
LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds"); // ====================================================================
// ============ job6 将被无限期地执行,每隔40秒执行一次
// ====================================================================
job = newJob(SimpleJob.class).withIdentity("job6", "group1").build();
trigger = newTrigger().withIdentity("trigger6", "group1").startAt(startTime)
.withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever()).build();
date = scheduler.scheduleJob(job, trigger);
LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds"); // ====================================================================
// ============ 启动调度器
// ====================================================================
scheduler.start(); // ====================================================================
// ============ 在调度器启动之后,新增加的job7仍将可以被调度,job7将5分钟执行一次,总共重复20次
// ====================================================================
job = newJob(SimpleJob.class).withIdentity("job7", "group1").build();
trigger = newTrigger().withIdentity("trigger7", "group1").startAt(startTime)
.withSchedule(simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20)).build();
date = scheduler.scheduleJob(job, trigger);
LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds"); // ====================================================================
// ============ job8绑定到group1,只有定义好触发器,才会被执行
// ====================================================================
job = newJob(SimpleJob.class).withIdentity("job8", "group1").storeDurably().build();
scheduler.addJob(job, true); // job添加到任务调度器
scheduler.triggerJob(jobKey("job8", "group1")); // 手动触发job8,绑定到group1 try {
Thread.sleep(30L * 1000L); // 等待30秒,让任务都执行完毕
} catch (Exception e) {
} /**
* 终止调度。
* 但是如果当前仍然有任务正在运行中,则会等待该任务执行完毕再终止,期间debug信息会打印:
* 21:48:54.965 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Waiting for thread TestScheduler_Worker-1 to shut down
*/
scheduler.shutdown(true); // 显示调度器的一些统计信息
SchedulerMetaData metaData = scheduler.getMetaData();
LOG.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs."); } // 演示触发器被重新调度案例
private void rescheduleJobDemo() throws SchedulerException {
// 初始化一个调度工厂,并实例化一个调度类
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
// 第一个参数:null就是默认当前时间,也可以指定时间
// 第二个参数:把一分钟按30进行划分,也就是60/30等份。
// 举例:当前时间是21:01:27,那么startTime就是21:01:30。当前时间是21:01:32,那么startTime就是21:02:00。
Date startTime = DateBuilder.nextGivenSecondDate(null, 15); // ====================================================================
// ============ job600 将被无限期地执行,每隔5秒执行一次,由trigger2019触发
// ====================================================================
JobDetail job = newJob(SimpleJob.class).withIdentity("job600", "group1").build();
SimpleTrigger trigger = newTrigger().withIdentity("trigger2019", "group1").startAt(startTime)
.withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
Date date = scheduler.scheduleJob(job, trigger);
LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every "
+ trigger.getRepeatInterval() / 1000 + " seconds");
// ====================================================================
// ============ 启动调度器
// ====================================================================
scheduler.start(); try {
System.out.println("线程进入睡眠");
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程被唤醒");
// ====================================================================
// ============ job600 被重新定义的trigger2019触发器重新调度,改为每1秒钟执行一次
// ====================================================================
SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2019", "group1").startAt(startTime)
.withSchedule(simpleSchedule().withIntervalInSeconds(1).repeatForever()).build();
Date date2 = scheduler.rescheduleJob(trigger2.getKey(), trigger2);
LOG.info("job600 rescheduled to run at: " + date2);
} public static void main(String[] args) throws Exception {
SimpleTriggerExample example = new SimpleTriggerExample();
example.run();
example.rescheduleJobDemo(); // 重新调度案例
} }

quartz2.3.0(二)触发器Trigger花式Scheduler调度job的更多相关文章

  1. 04 Zabbix4.0系统配置触发器trigger

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 04 Zabbix4.0系统配置触发器trigger 请点击查看Zabbix3.0.8版本trig ...

  2. quartz2.3.0(三)cron定义调度周期

    cron总结 cron详解参见:<quartz CronExpression表达式> CronTrigger配置完整格式为7个: [秒]   [分]   [小时]   [日]   [月]  ...

  3. quartz2.3.0系列目录——带您由浅入深全面掌握quartz2.3.0

    quartz2.3.0系列目录 官网下载地址:http://www.quartz-scheduler.org/downloads/ 本系列demo全部来源于官网,仅仅是简化和汉化了注释!一部分代码de ...

  4. quartz2.3.0(十三)数据库持久化定时器job任务和trigger触发器,在多个调度器实例情况下,由其它调度器实例恢复执行调度器宕机的job任务

    一.初始化数据库11张quartz表:qrtz_*   先从官网下载好quartz2.3.0包:http://www.quartz-scheduler.org/downloads/ 解压后进入目录:q ...

  5. quartz2.3.0(十二)通过RMI协议向Scheduler调度器远程添加job任务

    此代码示例通过RMI协议向Scheduler调度器远程添加job任务. 代码文件包括:job任务类(SimpleJob.java).RMI服务端server类(RemoteServerExample. ...

  6. quartz2.3.0(十)xml配置方式定义quartz定时任务

    1.新增pom依赖 除了按照<quartz2.3.0系列目录——带您由浅入深全面掌握quartz2.3.0>添加依赖之外,pom.xml里新增加依赖: <dependency> ...

  7. spring3.2.8+quartz2.2.0(比较全,对比quartz1.x的配置)

    spring3.2.8 + quartz2.2.0报错: java.lang.IncompatibleClassChangeError: class org.springframework.sched ...

  8. 如何使用MySQL触发器trigger

    阅读目录:触发器trigger的使用 创建触发器 单一执行语句.多执行语句 new.old详解 查看触发器 删除触发器:慎用触发器,不用就删除 Q:什么是触发器? A: 触发器是与表有关的数据库对象, ...

  9. pl/sql学习(5): 触发器trigger/事务和锁

    (一)触发器简单介绍 触发器是由数据库的特定时间来触发的, 特定事件主要包括以下几种类型: (1)DML: insert, update,delete 增删改 (2)DDL: create, alte ...

随机推荐

  1. Python json数据写入csv json excel文件

    一.写入 写入csv和json, 可以使用csv这个包写, 我这里没有使用, 并且把写csv和json的写到一起了 具体的代码就不解释了 def write_file(file_name, items ...

  2. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

  3. vue Uncaught SyntaxError: Unexpected token < 报错

    这个问题是因为项目中出现没有闭合的标签,如<img src="">  需改成<img src="xxx.png"/>

  4. 【Excel】定位条件快速将空值替换为指定值

    现有如下表格,表格中存在一些空值,如下图: 目的 将上图的空值全部赋值为100,实现后效果如下: 实现步骤 1.选中数字区域,按CTRL+G 2.点击[定位条件]后,选择[空值]后[确定] 3.在编辑 ...

  5. OpenFOAM——平行平板间具有相对运动(库埃特流)

    本算例翻译整理自:http://the-foam-house5.webnode.es/products/chapter-1-plane-parallel-plates-case/ 这个算例研究了一个距 ...

  6. [RoarCTF]Easy Calc

    目录 [RoarCTF]Easy Calc 知识点 1.http走私绕过WAF 2.php字符串解析特性绕过WAF 3.绕过过滤写shell [RoarCTF]Easy Calc 题目复现链接:htt ...

  7. #C++初学记录(树和二叉树)

    二叉树的编号 例题 6-6 小球下落问题 有一棵二叉树,最大深度为D,且所有叶子深度都相同.所有节点从上到下,从左到右编号为1,2,3,4,....,2^D-1.在节点1处放置小球,他会往下落.每个节 ...

  8. Tomcat的安装以及环境变量的配置

    目录 下载 解压并配置环境变量 测试 关闭服务 Tomcat启动时,控制台和IDEA控制台中文乱码解决方案 下载 官方网址:Apache Tomcat® https://tomcat.apache.o ...

  9. flowable表简要说明

    1. Flowable数据库表命名规则 ACT_RE_* ’RE’表示repository(存储).RepositoryService接口操作的表.带此前缀的表包含的是静态信息,如,流程定义,流程的资 ...

  10. (二)OpenCV-Python学习—对比度增强

    ·对于部分图像,会出现整体较暗或较亮的情况,这是由于图片的灰度值范围较小,即对比度低.实际应用中,通过绘制图片的灰度直方图,可以很明显的判断图片的灰度值分布,区分其对比度高低.对于对比度较低的图片,可 ...