摘要:触发器也可以给予名称和放置在组中,以方便地将它们调度内组织。作业可以被添加到所述调度器一次,而是具有多个触发器注册。调度类链接工作和触发器到一起,并执行它。
简介
Quartz是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间运行。Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至是十万的作业数。
官方链接,戳这里
Quartz 是一种功能丰富的,开放源码的作业调度库,可以在几乎任何Java应用程序集成 - 从最小的独立的应用程序到规模最大电子商务系统。Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至是十万的作业数 - 作业被定义为标准的Java组件,可以执行几乎任何东西,可以编程让它们执行。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。
Quartz 是可自由使用,使用Apache 2.0 license授权方式。
作业调度如果应用程序需要在给定时间执行任务,或者如果系统有连续维护作业,那么Quartz是理想的解决方案。
作业被安排在一个给定的触发时运行。触发器可以使用以下指令的接近任何组合来创建:
在一天中的某个时间(到毫秒)
在一周的某几天
在每月的某一天
在一年中的某些日期
不在注册的日历中列出的特定日期(如商业节假日除外)
重复特定次数
重复进行,直到一个特定的时间/日期
无限重复
重复的延迟时间间隔
作业是由其创建者赋予的名字,也可以组织成命名组。触发器也可以给予名称和放置在组中,以方便地将它们调度内组织。作业可以被添加到所述调度器一次,而是具有多个触发器注册。在企业Java环境中,作业可以执行自己的工作作为分布式(XA)事务的一部分。
集群故障切换
负载均衡
Quartz的内置的群集功能,通过JDBCJobStore依靠数据库持久
Terracotta扩展Quartz提供集群功能,而不需要一个支持数据库
使用的 jar 包quartz-2.2.1.jar
quartz-jobs-2.2.1.jar
三个重要的概念简介 Scheduler调度器。所有的调度都是由它控制。调度类链接“工作”和“触发器”到一起,并执行它。
scheduler 实例化后,可以启动(start)、暂停(stand-by)、停止(shutdown)。注意:scheduler 被停止后,除非重新实例化,否则不能重新启动;只有当 scheduler 启动后,即使处于暂停状态也不行,trigger 才会被触发(job才会被执行)
Scheduler的生命期,从SchedulerFactory创建它时开始,到Scheduler调用shutdown()方法时结束;Scheduler被创建后,可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,才会真正地触发trigger(即执行job)
Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger);
Scheduler的主要函数:
start():启动
standby():挂起
shutdown():关闭
shutdown(true)表示等待所有正在执行的job执行完毕后,在关闭scheduler
shutdown(false)即shutdown()表示直接关闭scheduler
注意关闭之后,scheduler不能从新开启,会抛出异常
TriggerTrigger用于触发Job的执行。当你准备调度一个job时,你创建一个Trigger的实例,然后设置调度相关的属性。Trigger也有一个相关联的JobDataMap,用于给Job传递一些触发相关的参数。Quartz自带了各种不同类型的Trigger,最常用的主要是SimpleTrigger和CronTrigger。
SimpleTrigger – 允许设置开始时间,结束时间,重复间隔。主要用于一次性执行的Job(只在某个特定的时间点执行一次),或者Job在特定的时间点执行,重复执行N次,每次执行间隔T个时间单位。
CronTrigger – 允许UNIX cron表达式来指定日期和时间来运行作业。在基于日历的调度上非常有用,如“每个星期五的正午”,或者“每月的第十天的上午10:15”等。
SimpleTrigger – 每5秒运行
Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyTriggerName", "group1") .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5).repeatForever()) .build();
CronTrigger – 每5秒运行。
Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyTriggerName", "group1") .withSchedule( CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build();JobDetail & Job
JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中。
JobDetail对象是在将job加入scheduler时,由客户端程序(你的程序)创建的。它包含job的各种属性设置,以及用于存储job实例状态信息的JobDataMap。
例子说明1.下载 jar 包
可以从官方网站或 Maven 中央存储库下载 Quartz 库文件;
2.创建一个作业
HelloJob.java
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloJob implements Job{ @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { // TODO Auto-generated method stub System.out.println("Hello Quartz!"); } }
3.创建触发器,以及通过调度执行作业
SimpleTrigger.java
import org.quartz.JobBuilder; 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; public class SimpleTrigger { public static void main(String[] args) throws Exception { JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("dummyJobName", "group1").build(); // 定义一个Trigger Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyTriggerName", "group1") // 定义 name/group .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5).repeatForever()) .build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } }
CronTrigger.java
import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class CronTrigger { public static void main(String[] args) throws Exception { JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("dummyJobName", "group").build(); Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyJobName", "group") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } }
输出的结果如下:
每隔五分钟就会打印出一条 Hello Quartz!
Hello Quartz! Hello Quartz! Hello Quartz!Quartz 的其他概念
JobExecutionContext
当 Schedule 调用一个 Job,就会将 JobExecutionContext 传递给 Job 的 execute() 方法
Job 能通过 JobExecutionContext 对象访问到 Quartz 运行时候的环境以及 Job本身的明细数据
JobDataMap
在进行任务调度时 JobDataMap存储在JobExecutionContext中,非常方便获取
JobDataMap 可以用来装载任何可序列化的数据对象,当job 实例对象被执行时这些参数对象会传递给它
JobDataMap实现了JDK的Map接口,并且添加了一些非常方便的方法用来存取数据基本类型
key
将Job和Trigger注册到Scheduler时,可以为它们设置key,配置其身份属性。
Job和Trigger的key(JobKey和TriggerKey)可以用于将Job和Trigger放到不同的分组(group)里,然后基于分组进行操作。
同一个分组下的Job或Trigger的名称必须唯一,即一个Job或Trigger的key由名称(name)和分组(group)组成。
实例说明第一步:创建一个 Job。
在这个类中,我们通过 JobExecutionContext 来获取 JobDataMap、key以及通过自定义传入的信息。代码中有备注,仔细看下就知道了。
HelloJob.java
import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.TriggerKey; public class HelloJob implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { // TODO Auto-generated method stub System.out.println("Hello Quartz!"); // 获取 JobDetail 的 key 和 group JobKey key = context.getJobDetail().getKey(); System.out.println("JobDetail key name: "+key.getName()); System.out.println("JobDetail key Group: "+key.getGroup()); // 从 JobExecutionContext 中获取一个实例, 获取从 jobDetail 传入的数据 JobDataMap dataMap = context.getJobDetail().getJobDataMap(); String JobMsg = dataMap.getString("message"); Float floatMsg = dataMap.getFloat("floatData"); System.out.println("JobDetial:"+ JobMsg); System.out.println("floatMsg:"+ floatMsg); //获取 trigger 的 key 和 group TriggerKey triggerKey = context.getTrigger().getKey(); System.out.println("TriggerKey key name: "+triggerKey.getName()); System.out.println("TriggerKey key Group: "+triggerKey.getGroup()); // 获取一个 trigger 的 jobDataMap 实例 JobDataMap triggerMap = context.getTrigger().getJobDataMap(); String triggerMsg = dataMap.getString("message"); System.out.println("triggerMsg:"+ triggerMsg); } }
第二步:测试类
import org.quartz.JobBuilder; 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; public class SimpleTrigger { public static void main(String[] args) throws Exception { JobDetail job = JobBuilder.newJob(HelloJob.class) .withIdentity("dummyJobName", "group1") .usingJobData("message", "hello myJob1") //传入自定义的数据 .usingJobData("floatData", 1.2F) .build(); // 定义一个Trigger Trigger trigger = TriggerBuilder .newTrigger() .withIdentity("dummyTriggerName", "group1") // 定义 name/group .usingJobData("message", "hello myTrigger") .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5).repeatForever()) .build(); Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); } }
输出结果
Hello Quartz! JobDetail key name: dummyJobName JobDetail key Group: group1 JobDetial:hello myJob1 floatMsg:1.2 TriggerKey key name: dummyTriggerName TriggerKey key Group: group1 triggerMsg:hello myJob1附
w3cschool 上的quartz 教程
官方链接
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71215.html
摘要:多作业例子在这个例子中,我们将介绍如何通过多个作业。在调度框架中,每个作业将被连接到一个唯一的触发,并且由调度器运行它。备注说明在中,一个触发器触发多个作业是不可以的。第一步创建个作业,,和。 多作业例子 在这个例子中,我们将介绍如何通过Quartz API 多个作业。在Quartz调度框架中,每个作业将被连接到一个唯一的触发,并且由调度器运行它。 备注说明:在 Quartz 中,一个...
摘要:分类中共包含有种触发器。建立一个触发器,每隔一分钟,每天上午点至下午点之间建立一个触发器,将在每天上午执行第一种实现方式第二种实现方式建立一个触发器,将在星期三上午在系统默认值之外执行第一种方式第二种方式 Trigger分类 Quartz中共包含有4种触发器。 常用的是: SimpleTrigger 和 CronTrigger。不常用的是:CalendarIntervalTrigger...
摘要:请注意,触发器将不会在上午点开始,仅在,,和请注意,一些调度要求太复杂,无法用单一触发表示例如每上午至之间每分钟,下午至晚上点之间每分钟一次。在这种情况下的解决方案是简单地创建两个触发器,并注册它们来运行相同的作业。 表达式说明 Cron-Expressions 用于配置 CronTrigger的实例。Cron Expressions 是由七个子表达式组成的字符串,用于描述日程表的各个...
摘要:有种东西学了记不住,是正则表达式,就是了。最近在用写个,我一个按键盘的,又没什么太多的闲钱去购买高大上的,不得已开始用上了学的好多遍都没学会的。 有10种东西学了记不住,00是正则表达式,10就是Vim了。 最近在用python写个side project,我一个按键盘的,又没什么太多的闲钱去购买高大上的IDE,不得已开始用上了学的好多遍都没学会的Vim。Vim有多牛X,随便问一个代码...
摘要:有种东西学了记不住,是正则表达式,就是了。最近在用写个,我一个按键盘的,又没什么太多的闲钱去购买高大上的,不得已开始用上了学的好多遍都没学会的。 有10种东西学了记不住,00是正则表达式,10就是Vim了。 最近在用python写个side project,我一个按键盘的,又没什么太多的闲钱去购买高大上的IDE,不得已开始用上了学的好多遍都没学会的Vim。Vim有多牛X,随便问一个代码...
阅读 1444·2023-04-25 15:50
阅读 1271·2021-09-22 15:49
阅读 2876·2021-09-22 15:06
阅读 3453·2019-08-30 15:54
阅读 2235·2019-08-29 11:33
阅读 2082·2019-08-23 17:56
阅读 2076·2019-08-23 17:06
阅读 1256·2019-08-23 15:55