作业调度是现代系统中对 Java 应用程序的一般要求,而且也是对 Java 开发人员一贯的要求。
作业调度最合适的解决方案就是来自 OpenSymphony 的 Quartz API。
Quartz 允许开发人员根据时间间隔(或天)来调度作业,Quartz将作业和触发器分开,这样可以方便二者的自由组合,形成多对多的关系。其中作业,是指能够调度执行的任务,而触发器是指对作业的调度,包括对时间的安排等。
Quartz的HelloWord:
1.环境:quartz-1.6.6 过程中需引入 quartz-1.6.6.jar和 commons-logging-1.1.jar(在下下来的官方包中有,后者在lib/core包中)
2.作业的编写 implements Job
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements Job {
private static Log _log = LogFactory.getLog(HelloJob.class);
public HelloJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
// Say Hello to the World and display the date/time
_log.info("Hello World! - " + new Date());
}
}
解释:在 execute 方法接受一个 JobExecutionContext 对象作为参数。这个对象提供了作业实例的运行时上下文
2.触发器的编写
package example1;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
/**
*
* 作业调度理解:
* 1.初始化: 从调度工厂中取出调度器
* 2.调度作业:创建作业和触发器,并装配在一起
* 3.启动
* 4.关闭
*/
public class SimpleExample {
public void run() throws Exception {
Log log = LogFactory.getLog(SimpleExample.class);
log.info("------- Initializing ----------------------");
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
log.info("------- Initialization Complete -----------");
log.info("------- Scheduling Jobs -------------------");
// computer a time that is on the next round minute
Date runTime = TriggerUtils.getEvenMinuteDate(new Date());
// define the job and tie it to our HelloJob class
JobDetail job = new JobDetail("job1", "group1", HelloJob.class);
// Trigger the job to run on the next round minute
SimpleTrigger trigger =
new SimpleTrigger("trigger1", "group1", runTime);
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
log.info(job.getFullName() + " will run at: " + runTime);
log.info("------- Started Scheduler -----------------");
sched.start();
log.info("------- Waiting 90 seconds... -------------");
try {
// wait 90 seconds to show jobs
Thread.sleep(90L * 1000L);
} catch (Exception e) {
}
log.info("------- Shutting Down ---------------------");
sched.shutdown(true);
log.info("------- Shutdown Complete -----------------");
}
public static void main(String[] args) throws Exception {
SimpleExample example = new SimpleExample();
example.run();
}
}
解释:JobDetail:JobDetail 对象储存作业的侦听器、群组、数据映射、描述以及作业的其他属性,是作业状态的存储
以上完成了QuartzHelloWord的编写,对Quartz有了初步的印象,下面对触发器进行点探讨。
CronTrigger 支持类似日历的重复间隔,而不是单一的时间间隔.
Cron 表达式包括以下 7 个字段:
– 秒(0-59)
– 分(0-59)
– 小时(0-23)
– 每月第几天(1-31)
– 月(1-12或JAN-DEC)
– 每星期第几天(1-7或SUN-SAT)
– 年(1970-2099)
• 特殊字符
–
– " /"--表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次
其中「每月第几天」与「每星期第几天」是互斥的,两个只能设定一个,不设定的以 ? 符号代替,如果有好几个时间点,可以使用 , 符号,例如:「0 0 10,12,14 * * ?」表示每天的10时、12时、14时要执行Job
"-"--表连续 ,例如「0 0 10,12,14 1-15 * ?」表示每月的1到15日每10时、12时、14时要执行Job,时间格式中的年指定可有可无,例如:「0 0 10,12,14 ? * MON 2006」表示2006年每星期一的10时、12时、14时要执行Job。
"?"--可以理解为只是站位的意思,只有在月内日期和周内日期字段中可用,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要
"L"(last)--只有在月内日期和周内日期字段中可用,放在月内日期字段中,表示安排在当月最后一天执行;在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。
"w"--执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。
"#”--给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一
"*"--任意
具体例子:
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.impl.StdSchedulerFactory;
public class CronTriggerExample {
public void run() throws Exception {
Log log = LogFactory.getLog(CronTriggerExample.class);
log.info("------- Initializing -------------------");
// First we must get a reference to a scheduler
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
log.info("------- Initialization Complete --------");
log.info("------- Scheduling Jobs ----------------");
// jobs can be scheduled before sched.start() has been called
// job 1 will run every 20 seconds
JobDetail job = new JobDetail("job1", "group1", SimpleJob.class);
CronTrigger trigger = new CronTrigger("trigger1", "group1", "job1",
"group1", "0/5 * * * * ?");
sched.addJob(job, true);
Date ft = sched.scheduleJob(trigger);
log.info(job.getFullName() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
// job 2 will run every other minute (at 15 seconds past the minute)
job = new JobDetail("job2", "group1", SimpleJob.class);
trigger = new CronTrigger("trigger2", "group1", "job2", "group1",
"15 0/2 * * * ?");
sched.addJob(job, true);
ft = sched.scheduleJob(trigger);
log.info(job.getFullName() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
// job 3 will run every other minute but only between 8am and 5pm
job = new JobDetail("job3", "group1", SimpleJob.class);
trigger = new CronTrigger("trigger3", "group1", "job3", "group1",
"0 0/2 8-17 * * ?");
sched.addJob(job, true);
ft = sched.scheduleJob(trigger);
log.info(job.getFullName() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
// job 4 will run every three minutes but only between 5pm and 11pm
job = new JobDetail("job4", "group1", SimpleJob.class);
trigger = new CronTrigger("trigger4", "group1", "job4", "group1",
"0 0/3 17-23 * * ?");
sched.addJob(job, true);
ft = sched.scheduleJob(trigger);
log.info(job.getFullName() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
// job 5 will run at 10am on the 1st and 15th days of the month
job = new JobDetail("job5", "group1", SimpleJob.class);
trigger = new CronTrigger("trigger5", "group1", "job5", "group1",
"0 0 10am 1,15 * ?");
sched.addJob(job, true);
ft = sched.scheduleJob(trigger);
log.info(job.getFullName() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
// job 6 will run every 30 seconds but only on Weekdays (Monday through
// Friday)
job = new JobDetail("job6", "group1", SimpleJob.class);
trigger = new CronTrigger("trigger6", "group1", "job6", "group1",
"0,30 * * ? * MON-FRI");
sched.addJob(job, true);
ft = sched.scheduleJob(trigger);
log.info(job.getFullName() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
// job 7 will run every 30 seconds but only on Weekends (Saturday and
// Sunday)
job = new JobDetail("job7", "group1", SimpleJob.class);
trigger = new CronTrigger("trigger7", "group1", "job7", "group1",
"0,30 * * ? * SAT,SUN");
sched.addJob(job, true);
ft = sched.scheduleJob(trigger);
log.info(job.getFullName() + " has been scheduled to run at: " + ft
+ " and repeat based on expression: "
+ trigger.getCronExpression());
log.info("------- Starting Scheduler ----------------");
sched.start();
log.info("------- Started Scheduler -----------------");
log.info("------- Waiting five minutes... ------------");
try {
Thread.sleep(300L * 1000L);
} catch (Exception e) {
}
log.info("------- Shutting Down ---------------------");
sched.shutdown(true);
log.info("------- Shutdown Complete -----------------");
SchedulerMetaData metaData = sched.getMetaData();
log.info("Executed " + metaData.numJobsExecuted() + " jobs.");
}
public static void main(String[] args) throws Exception {
CronTriggerExample example = new CronTriggerExample();
example.run();
}
}
分享到:
相关推荐
Quartz是一款开源的作业调度框架,它允许开发者安排任务在特定时间执行,从而实现定时任务的需求。Quartz支持多种触发器(Trigger)和作业(Job),可以满足复杂的调度需求。 **一、Quartz的核心概念** 1. **作业...
Quartz 是个开放源码项目,提供了丰富的作业调度集。在这篇文章中,软件工程师 Michael Lipton 和IT 架构师 Soobaek Jang 对 Quartz API 进行了介绍,从对框架的一般概述开始,并以一系列展示 Quart 基本特性的代码...
这个“作业调度Quartz.net源代码”文件很可能是包含了Quartz.NET的示例代码或者一个简单的项目,帮助用户理解和学习如何使用Quartz.NET进行作业调度。 Quartz.NET的核心概念包括作业(Job)、触发器(Trigger)和...
解压"quartz-2.4.0-SNAPSHOT-distribution.tar.gz"后,我们主要会看到一个名为"quartz-2.4.0-SNAPSHOT"的目录,其中包含了Quartz框架的所有组件和相关文档。这个目录下通常会有以下内容: 1. **JAR文件**:核心库...
Quartz是一款开源的作业调度框架,它为Java应用程序提供了强大的定时任务处理能力。在Spring框架中,Quartz可以被集成来实现复杂的定时任务调度。本文将深入探讨Quartz的使用,包括其基本概念、配置、API以及在Web...
Quartz是一款广泛应用于Java环境中的开源作业调度框架,它的核心功能是实现任务的自动化执行,如定时触发、周期性执行等。Quartz以其强大的灵活性和稳定性,在企业级应用中占据了重要地位,尤其对于需要定时执行任务...
Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它提供了丰富的API和灵活性,使得开发者可以方便地定义、安排和管理各种任务。版本1.8.6是Quartz的一个稳定版本,它包含了对数据库...
前言:8月份翻译了Quartz.NET的官方课程:开源的作业调度框架 - Quartz.NET, 有的朋友抱怨难用,确实,目前Qiartz.NET的最新版本还是0.6,还存在很多bug和不完善的地方。本文使用一系列代码示例介绍 Quartz.NET API...
2. **配置文件**:可以通过配置文件`quartz.properties`或`quartz-job.xml`来定义触发器和定时描述等。 #### 五、Quartz高级特性 除了基础的定时任务调度之外,Quartz还支持许多高级特性,如集群部署、持久化存储、...
在标题中提到的 "quartz-all-1.6.0" 版本,是 Quartz 框架的一个特定发行版,它包含了所有必要的组件和库,以便在 Java 环境下使用。 Quartz 主要功能包括: 1. **任务调度**:Quartz 提供了强大的 API,可以方便地...
Quartz作业调度是一个开源的Java作业调度框架,它允许开发者创建、调度和执行应用程序中的重复或定时任务。这个"quartz作业调度Demo"提供了一个简单的示例,帮助我们理解如何在实际项目中利用Quartz来管理任务。 1....
Quartz作业调度框架是Java领域中非常重要的一个开源作业调度库。作业调度是指在预定的时间安排特定的任务进行执行。在企业级应用中,作业调度扮演着核心的角色,它使得企业能够自动化地执行定时任务,比如数据备份、...
Quartz是一个开源的作业调度框架,允许应用程序定义和调度任务在特定时间执行。而Spring-Quartz则是Spring框架对Quartz的集成,它使得在Spring应用中使用Quartz变得更加方便。 Quartz的核心概念包括Job(作业)、...
Java作业调度之Quartz是一个广泛使用的开源任务调度框架,它允许开发者在应用程序中安排复杂的作业执行计划。Quartz是基于Java的,因此可以轻松地集成到任何Java应用程序中,包括Web应用。这篇博客文章(虽然链接...
Quartz是开源的作业调度框架,它为Java应用程序提供了强大的定时功能。在Spring框架中集成Quartz,可以方便地创建和管理定时任务,使得开发者无需关注底层调度逻辑,专注于业务逻辑的实现。"quartz-2.1.6.zip"这个...
Quartz是开源的Java作业调度框架,用于在Java应用程序中安排任务执行。版本2.2.1是最新的稳定版本,提供了许多改进和增强的功能。在本文中,我们将深入探讨Quartz 2.2.1的核心特性、使用场景、配置方法以及如何在...
Quartz是开源的作业调度框架,它允许Java开发者在应用程序中安排任务的执行。这个"quartz-2.1.7"版本是Quartz库的一个重要发布,专注于提供可靠的定时任务管理和执行。在这个版本中,Quartz进行了多方面的优化和改进...
quartz:是一个任务调度框架,通过触发器设置作业的定时运行规则,来执行定时任务。相当于数据库中的 Job、Windows 的计划任务、Unix/Linux 下的 Cron,但 Quartz 可以把排程控制的更精细。把一系列任务自动安置到一...
Quartz.Net是一个开源的作业调度框架,用于在.NET环境中创建和执行定时任务。它提供了高度可配置性,灵活性和稳定性,使得开发人员可以方便地在应用程序中集成定时任务功能。"基于Quartz.Net组件实现定时任务调度-...
Quartz是一个开源的作业调度框架,它可以安排和执行基于时间的任务,而SpringBoot则提供了简化Java应用开发的便利性。本案例中,我们将深入探讨如何在SpringBoot应用中集成Quartz定时任务框架,以及如何配置和运行每...