1.Trigger是什么

  Quartz中的触发器用来告诉调度程序作业什么时候触发,即Trigger对象是用来触发执行job的。

 2.Quartz中的Trigger

 3.触发器通用属性:

JobKey:表示job实例的标识,触发器被触发时,该指定的job实例会执行

StartTime:表示触发器的时间表 首次被触发的时间,值类型是Java.util.Date

EndTime:指定触发器的不再触发的时间,它的值类型是Java.util.Date

例如:通过Trigger设置开始时间,结束时间以及在Job中通过trigger获取job标识与trigger的开始时间与结束时间

HelloJob.java(通过trigger获取job标识与trigger的开始时间与结束时间)

package cn.qlq.quartz;

import java.text.SimpleDateFormat;
import java.util.Date; import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Trigger;
import org.quartz.TriggerKey; public class HelloJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException {
//打印当前的时间
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 1.获取Trigger
Trigger trigger = context.getTrigger();
//2.通过trigger获取job标识
JobKey jobKey = trigger.getJobKey();
System.out.println("Job's key:"+"name:"+jobKey.getName()+"\tgroup:"+jobKey.getGroup());getClass();
System.out.println("Start time : "+sf.format(trigger.getStartTime()));
System.out.println("End time : "+sf.format(trigger.getEndTime())); } }

HelloScheduler.java(用Trigger设置开始时间,结束时间)

package cn.qlq.quartz;

import static org.quartz.DateBuilder.newDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar; import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar; public class HelloScheduler {
public static void main(String[] args) {
try {
//1. 创建一个JodDetail实例 将该实例与Hello job class绑定 (链式写法)
JobDetail jobDetail = newJob(HelloJob.class) // 定义Job类为HelloQuartz类,这是真正的执行逻辑所在
.withIdentity("myJob") // 定义name/group
.build(); //2. 定义一个Trigger,定义该job立即执行,并且每两秒钟执行一次,直到永远
//2.1设置Trigger的开始时间(3s后开始)
Date startTime = new Date();
startTime.setTime(startTime.getTime()+3000);
//2.2设置Trigger的结束时间(6s后开始)
Date endTime = new Date();
endTime.setTime(endTime.getTime()+6000);
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")// 定义名字和组
.startAt(startTime)
.endAt(endTime)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever())
.build(); //3. 创建scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //4. 将trigger和jobdetail加入这个调度
scheduler.scheduleJob(jobDetail, trigger); //5. 启动scheduler
scheduler.start(); } catch (Exception e) {
e.printStackTrace();
}
}
}

结果:

Job's key:name:myJob    group:DEFAULT
Start time : 2018-04-04 10:43:54
End time : 2018-04-04 10:43:57
Job's key:name:myJob group:DEFAULT
Start time : 2018-04-04 10:43:54
End time : 2018-04-04 10:43:57

---------------------------浅谈SimpleTrigger----------------------

SimpleTrigger的作用

  在一个指定时间段内执行一次作业任务或是在指定时间间隔内执行多次作业任务

 

 例一:4秒钟后执行任务并且只执行一次

HelloJob.java
package cn.qlq.quartz;

import java.text.SimpleDateFormat;
import java.util.Date; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; public class HelloJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException {
//打印当前的时间
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
System.out.println("current exec time is :"+sf.format(date));
} }

HelloScheduler.java

package cn.qlq.quartz;

import static org.quartz.JobBuilder.newJob;

import java.text.SimpleDateFormat;
import java.util.Date; import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory; public class HelloScheduler {
public static void main(String[] args) {
try {
// 1. 创建一个JodDetail实例 将该实例与Hello job class绑定 (链式写法)
JobDetail jobDetail = newJob(HelloJob.class) // 定义Job类为HelloQuartz类,这是真正的执行逻辑所在
.withIdentity("myJob") // 定义name/group
.build();
// 打印当前的时间
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
System.out.println("current time is :" + sf.format(date)); // 2. 定义一个Trigger,定义该job在4秒后执行,并且执行一次
Date startTime = new Date();
startTime.setTime(startTime.getTime()+4000L);
SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")// 定义名字和组
.startAt(startTime)
.build(); // 3. 创建scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 4. 将trigger和jobdetail加入这个调度
scheduler.scheduleJob(jobDetail, trigger); // 5. 启动scheduler
scheduler.start(); } catch (Exception e) {
e.printStackTrace();
}
}
}

结果:

current time is :2018-04-05 10:16:33
current exec time is :2018-04-05 10:16:37

 例二:一个jobjob在4秒后首次执行,并且每隔两秒执行一次,重复执行无数次

修改上面的HelloScheduler中Trigger的定义

            // 2. 定义一个Trigger,定义该job在4秒后首次执行,并且每隔两秒执行一次
Date startTime = new Date();
startTime.setTime(startTime.getTime() + 4000L);
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")// 定义名字和组
.startAt(startTime)//定义开始时间
.withSchedule( //定义任务调度的时间间隔和次数
SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(2)//定义时间间隔是2秒
.withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)//定义重复执行次数是无限次
)
.build();

 例三:一个jobjob在4秒后首次执行,并且每隔两秒执行一次,重复执行3次

修改上面的HelloScheduler中Trigger的定义

            // 2. 定义一个Trigger,定义该job在4秒后首次执行,并且每隔两秒执行一次,重复3次
Date startTime = new Date();
startTime.setTime(startTime.getTime() + 4000L);
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")// 定义名字和组
.startAt(startTime)//定义开始时间
.withSchedule( //定义任务调度的时间间隔和次数
SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(2)//定义时间间隔是2秒
.withRepeatCount(3)//定义重复执行次数是无限次
)
.build();

结果:

current time is :2018-04-05 10:27:40
current exec time is :2018-04-05 10:27:44
current exec time is :2018-04-05 10:27:46
current exec time is :2018-04-05 10:27:48
current exec time is :2018-04-05 10:27:50

 例四:定义开始时间在4s后,结束时间在6s后,同时也定义每隔两秒执行一次,重复执行3次

修改上面的HelloScheduler中Trigger的定义

            // 2. 定义一个Trigger,定义该job在4秒后执行,6s后停止
//2.1设置开始时间为4s后
Date startTime = new Date();
startTime.setTime(startTime.getTime() + 4000L);
//2.2设置结束时间为6s后
Date endTime = new Date();
endTime.setTime(endTime.getTime() + 6000L);
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")// 定义名字和组
.startAt(startTime)//定义开始时间为4s后
.endAt(endTime)//定义结束时间为6s后
.withSchedule( //定义任务调度的时间间隔和次数
SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(2)//定义时间间隔是2秒
.withRepeatCount(3)//定义重复执行次数是无限次
)
.build();

结果:

current time is :2018-04-05 10:34:46
current exec time is :2018-04-05 10:34:50

  表明endAt()的优先级高级后面定义的频度。也就是如果定义了结束时间,会在指定时间结束。

SimpleTrigger总结:

  1.重复次数可以是0,正整数或是SimpleTrigger.REPEAT_INDEFINITELY常量值。我们点击发现REPEAT_INDEFINITELY是-1,也就是-1表示无线次。

  2.重复执行时间间隔必须为0或长整数。可以用小时,分钟,秒数的单位限制间隔

  3.一旦指定了endTime参数,那么它会覆盖重复次数参数的效果。

-----------------------------浅谈CronTrigger---------------------------------

0.CronTrigger的作用

基于日历的作业调度器,而不是像SimpleTrigger那样精确指定间隔时间,比SimpleTrigger更常用。

1.Cron表达式

用于配置CronTrigger实例

是由7个子表达式组成的字符串,描述了时间表的详细信息

格式:[秒][分][小时][日][月][周][年]

书写规则:知道确定日期的写上,不知道的用*代替  (年可以省略,只写前6个) 

2.Cron表达式特殊字符意义对应表

特殊符号解释

Cron表达式举例

Cron表达式小提示

L和W可以一组合使用
周字段英文字母不区分大小写即MON与mon相同
利用工具,在线生成  http://cron.qqe2.com/

3.例子:

HelloJob.java

package cn.qlq.quartz;

import java.text.SimpleDateFormat;
import java.util.Date; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; public class HelloJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException {
//打印当前的时间
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
System.out.println("current exec time is :"+sf.format(date));
} }

 例一:每秒钟都执行上面job,重复无数次

HelloScheduler.java

package cn.qlq.quartz;

import static org.quartz.JobBuilder.newJob;

import java.text.SimpleDateFormat;
import java.util.Date; import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory; public class HelloScheduler {
public static void main(String[] args) {
try {
// 1. 创建一个JodDetail实例 将该实例与Hello job class绑定 (链式写法)
JobDetail jobDetail = newJob(HelloJob.class) // 定义Job类为HelloQuartz类,这是真正的执行逻辑所在
.withIdentity("myJob") // 定义name/group
.build();
// 打印当前的时间
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = new Date();
System.out.println("current time is :" + sf.format(date)); // 2. 定义一个Trigger,定义该job立即执行,并且每秒都执行一次。重复无数次
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")// 定义名字和组
.withSchedule( //定义任务调度的时间间隔和次数
CronScheduleBuilder
.cronSchedule("* * * * * ? *")
)
.build(); // 3. 创建scheduler
SchedulerFactory sfact = new StdSchedulerFactory();
Scheduler scheduler = sfact.getScheduler(); // 4. 将trigger和jobdetail加入这个调度
scheduler.scheduleJob(jobDetail, trigger); // 5. 启动scheduler
scheduler.start(); } catch (Exception e) {
e.printStackTrace();
}
}
}

结果:

current time is :2018-04-05 10:56:37
current exec time is :2018-04-05 10:56:37
current exec time is :2018-04-05 10:56:38
current exec time is :2018-04-05 10:56:39
current exec time is :2018-04-05 10:56:40

.....

 例二:2018年内每天11点18开始执行,每隔5s执行一次

修改上面HelloScheduler中的Trigger:

            // 2. 2018年内每天11点18开始执行,每隔5s执行一次
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")// 定义名字和组
.withSchedule( //定义任务调度的时间间隔和次数
CronScheduleBuilder
.cronSchedule("0/5 18 11 ? * * 2018")
)
.build();

 例三:每天的14点整至14点59分55秒,以及18点整至18点59分55秒,每5秒钟执行一次

            CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")// 定义名字和组
.withSchedule( //定义任务调度的时间间隔和次数
CronScheduleBuilder
.cronSchedule("0/5 0 14,18 * * ? *")
)
.build();

浅谈Trigger(SimpleTrigger&CronTrigger)的更多相关文章

  1. 浅谈Quartz(SimpleTrigger&CronTrigger)

    private void quartzOrderReturn(List<String> returnIds) { try { Scheduler scheduler = StdSchedu ...

  2. 浅谈Trigger

  3. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

    本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...

  4. 浅谈Quartz定时任务调度

    一  开发概述 对于具有一定规模的大多数企业来说,存在着这样一种需求:存在某个或某些任务,需要系统定期,自动地执行,然而,对大多数企业来说,该技术的实现,却是他们面临的一大难点和挑战.  对于大部分企 ...

  5. 【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  6. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  7. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  8. 浅谈requests库

    本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 安装 pip install requests # 是requests而不是request(有s的) re ...

  9. Salesforce 生命周期管理(一)应用生命周期浅谈

    本篇参考: https://trailhead.salesforce.com/en/content/learn/trails/determine-which-application-lifecycle ...

随机推荐

  1. 第三章 持续集成jenkins工具使用之邮件配置

    1   Email Extension Plugin插件安装 持续集成很重要的一环就是及时将构建结果通知到对应的责任人,如:构建失败了,至少需要下发通知给造成本次构建失败的开发人员,如果包含自动化测试 ...

  2. JDK版本Java SE、Java EE、Java ME的区别

    想在win7 X64上搭建JAVA开发环境来着(只是尝试下),打开JAVA 官网下载JDK,发现好多版本懵了,百度了下找到这些版本的区别,故有了下文 1.JAVA SE Java2平台标准版(Java ...

  3. 制作QQ微信支付宝三合一收款码

    转载:http://blog.mambaxin.com/article/56 发现很多博客都带了打赏功能,虽说打赏的人可能很少,但始终是一份心意,能让博主知道自己写的文章有用,能够帮助到人.所以,我也 ...

  4. 【bzoj4417】[Shoi2013]超级跳马 矩阵乘法

    题目描述 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可行的跳法.   ...

  5. Luogu1092 NOIP2004虫食算(搜索+高斯消元)

    暴力枚举每一位是否进位,然后就可以高斯消元解出方程了.然而复杂度是O(2nn3),相当不靠谱. 考虑优化.注意到某一位进位情况的变化只会影响到方程的常数项,于是可以在最开始做一次高斯消元算出每个未知数 ...

  6. 【题解】CF#983 E-NN country

    首先,我们从 u -> v 有一个明显的贪心,即能向上跳的时候尽量向深度最浅的节点跳.这个我们可以用树上倍增来维护.我们可以认为 u 贪心向上跳后不超过 lca 能跳到 u' 的位置, v 跳到 ...

  7. 【题解】Atcoder ARC#90 F-Number of Digits

    Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...

  8. [洛谷P1440]求m区间内的最小值

    题目大意:给你n个数,求出每个数前m位的最小值 题解:单调队列,用一个可以双向弹出的队列来存一串数,满足里面的数具有单调性,我们可以假设它是单调递增的,即求最小的数.那么可以把要插入的这个数与队尾元素 ...

  9. POJ.3624 Charm Bracelet(DP 01背包)

    POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...

  10. openssl安装相关软件

    出现:error: openssl/md5.h: No such file or directory 原因是libssl-dev 没有安装,执行: sudo apt-get install libss ...