`
- 浏览:
34536 次
- 性别:
- 来自:
深圳
-
使用Quartz实现定时功能
Quartz是一个完全由java编写的开源作业调度框架,具体的介绍可到http://www.opensymphony.com/quartz/官方网站查看。
Quartz的几个核心的接口和类为:
Job接口:自己写的“定时程序”实现此接口的void execute(JobExecutionContext arg0)方法,Job还有一类为有状态的StatefulJob接口,如果我们需要在上一个作业执行完后,根据其执行结果再进行下次作业的执行,则需要实现此接口。
Trigger抽象类:调度类(Scheduler)在时间到时调用此类,再由trigger类调用指定的定时程序。
Quertz中提供了两类触发器为:SimpleTrigger,CronTrigger。前者用于实现比较简单的定时功能,例如几点开始,几点结束,隔多长时间执行,共执行多少次等,后者提供了使用表达式来描述定时功能,因此适用于比较复杂的定时描述,例如每个月的最后一个周五,每周的周四等。
JobDetail类:具体某个定时程序的详细描述,包括Name,Group,JobDataMap等。
JobExecutionContext类:定时程序执行的run-time的上下文环境,用于得到当前执行的Job的名字,配置的参数等。
JobDataMap类:用于描述一个作业的参数,参数可以为任何基本类型例如String,float等,也可为某个对象的引用.
JobListener,TriggerListener接口:用于监听触发器状态和作业扫行状态,在特写状态执行相应操作。
JobStore类:在哪里执行定进程序,可选的有在内存中,在数据库中。
简单的定时程序:
public class TestJob implements Job
{
public TestJob(){}
public void execute(JobExecutionContext arg0) throws JobExecutionException
{
String name = context.getJobDetail().getJobDataMap().getString("name");
System.out.println("job executing..."+name); }
}
public class QuartzTest
{
public static void main(String[] args)
{
QuartzTest test = new QuartzTest();
try
{
test.startSchedule();
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void startSchedule() throws Exception
{
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail jobDetail =
new JobDetail("testJob", Scheduler.DEFAULT_GROUP, TestJob.class);
//结束时间
long end = System.currentTimeMillis() + 9000L;
//执行10次,每3秒执行一次,到9秒后结束
SimpleTrigger trigger = new SimpleTrigger("test",null,new Date(),new Date(end),10,3000L);
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}
}
在使用上面两个类实现定时的功能的时候,你可能会遇到发生异常的情况:
quartz报错java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set
quartz报错:
Caused by: java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set;
的原因是由于使用的commons-collections.jar版本太低导致的要使用3.*的才行。
对于使用MyEclipse的,如果导入了commons-collections.jar 3.*的包还不行,而且没有找到其他的包的话很可能是MyEclipse自带的Liberary中包括了版本低的包而你导入了这个lib。
比如MyEclipse的Hibernate的Lib中包括commons-collections.jar但是版本是2.*。
Window->Preferences->Myeclipse->Project Capabilities->Hibernate
从lib中删除此包即可。
执行上面这个类基本实现了一个简单的定时程序。但问题是现在这个类只能应用在application中,在web环境里执行还需要添加一些配置,例如添加servlet,添加配置文件quartz.properties或者quartz-job.xml(在XML文件里以配置方式定义triiger,定时描述等)。
web应用中使用
在web.xml中添加QuartzInitializerServlet,Quartz为能够在web应用中使用,提供了一个QuartzInitializerServlet和一个QuartzInitializerListener,用于在加载web应用时,对quartz进行初始化。我在使用servlet时加载成功,在使用listener时不成功,不知道怎么回事?
servlet配置:
<servlet>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>config-file</param-name>
<param-value>quartz.properties</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
listener配置可以看源码,主要的上面的参数配置为<context-param>,再加一个<listener>.
上面提到了quartz.properties,这是自行指定的,Quartz提供了一个默认的配置文件,可以满足基本的j2se应用,如果在web应用中,我们想把job,trigger配置都写到文件中,就需要自己来写,并指定在初始化时加载我们自己的quratz.properties,位置放在classes下。
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = org.quartz.scheduler.instanceId = AUTO
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure Plugins
#============================================================================
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = /scheduler/quartz_jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10
quartz要使用插件来加载自己的xml配置文件,上边我们指定了在初始化时加载classes\scheduler\quartz_jobs.xml,默认的是加载classes\quartz_jobs.xml文件。
quartz_jobs.xml文件:
<?xml version='1.0' encoding='utf-8'?>
<quartz>
<job>
<job-detail>
<name>test</name>
<group>DEFAULT</group>
<description>testJobhere</description>
<job-class>TestJob</job-class>
<job-data-map allows-transient-data="true">
<entry>
<key>name</key>
<value>test</value>
</entry>
</job-data-map>
</job-detail>
<trigger>
<cron>
<name>testCron</name>
<group>DEFAULT</group>
<job-name>test</job-name>
<job-group>DEFALUT</job-group>
<cron-expression>0/3 * * * * ?</cron-expression>
</cron>
</trigger>
</job>
</quartz>
上面配置了一个作业,并声明一个参数Name;配置了一个CronTrigger,每三秒执行一次。如果要配置SimpleTrigger ,可以使用<simple>标签。
上面与Job对应的类为TestJob,源码为:
public class TestJob implements Job
{
public TestJob(){}
public void execute(JobExecutionContext context) throws JobExecutionException
{
String name = context.getJobDetail().getJobDataMap().getString("name");
System.out.println("job executing..."+name);
}
}
在quartz_job.xml文件中还可以指定TriggerListener,JobListener等,可以使用<trigger-listener>,<job-listener>标签来指定。
时间格式具体说明:
字段 允许值 允许的特殊字符
秒 0 - 59 , - * /
分 0 - 59 , - * /
小时 0 - 23 , - * /
日期 1 - 31 , - * ? / L W C
月份 1 - 12 或者 JAN-DEC , - * /
星期 1 - 7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空 , 1970 - 2099 , - * /
表达式意义:
" 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/5 14 * * ? " 在每天下午2点到下午2:55期间的每5分钟触发
" 0 0/5 14,18 * * ? " 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
" 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触发
0 6 * * * 每天早上6点
0 */ 2 * * * 每两个小时
0 23 - 7 / 2 , 8 * * * 晚上11点到早上8点之间每两个小时,早上八点
0 11 4 * 1 - 3 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 4 1 1 * 1月1日早上4点
由于quartz目前文档不是很多,大部分都是看源码。总体看Quartz提供的CronTrigger使用表达式方式描述定时规律这个功能还是很强大的,在其源码中有很多例子。
spring已经把quartz集成在一起,并进行了封装,使用起来还是很方便的。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
### Quartz定时器介绍与简单使用 #### 1.1 Quartz介绍 Quartz 是一款功能强大的开源任务调度框架,它完全采用 Java 编写而成。该框架允许开发人员以灵活的方式定义作业及其触发规则,从而实现对任务的定时调度。...
作为一个专业的IT行业大师,我很高兴为你解析Quartz定时器的核心概念、功能以及如何通过源码学习。 Quartz定时器允许开发者创建、调度和管理任务,这些任务可以是简单的函数调用或者复杂的业务流程。它支持多种调度...
Spring Quartz 定时器示例(Web工程版),欢迎下载。
Quartz定时器是一个开源的作业调度框架,专为J2SE和J2EE应用程序设计,完全用Java编写。它的核心优势在于提供强大的灵活性和简单性,使得开发者可以轻松创建简单的或复杂的任务调度。Quartz支持多种特性,如数据库...
Quartz定时器API是Java平台上一个强大的作业调度框架,它被广泛用于构建自动化任务和后台作业,例如数据备份、报表生成、系统维护等。Quartz提供了丰富的API来创建、管理和控制作业(Jobs)和触发器(Triggers),...
下面,我们将深入探讨Quartz定时器的工作原理、配置、API使用以及在实际项目中的应用案例。 1. **Quartz简介** - Quartz是一个基于JDBC存储的可扩展的作业调度框架,能够用于执行计划性的任务。 - 它支持复杂的...
在Java Spring框架中,开发者有多种选择来实现定时任务的功能,其中最为流行的两种方式分别是使用Java自带的`Timer`类以及OpenSymphony的Quartz定时器。本文将重点探讨Quartz定时器的配置与使用,尤其是其时间设置的...
这个"一个简单的quartz定时器的demo"是展示如何在项目中集成和使用Quartz的基本步骤,包括创建任务、配置调度器以及管理任务的生命周期。 首先,Quartz的核心组件包括Scheduler(调度器)、Job(任务)和Trigger...
Quartz定时器表 执行语句 方便部署处理数据
本文将详细讲解如何在Spring Boot项目中集成Quartz定时器,以及如何利用Spring的依赖注入特性来实现Job。 一、集成Quartz定时器 1. 添加依赖:首先,你需要在Spring Boot项目的`pom.xml`或`build.gradle`文件中...
Spring Quartz定时器是Java开发中常用的一个任务调度框架,它结合了Spring框架的强大功能与Quartz的灵活性,使得开发者能够方便地在应用中实现定时任务。在这个压缩包中,包含了三个核心的jar文件:`quartz-all-...
Quartz定时器是一款广泛应用于Java开发中的开源任务调度框架,其功能强大且灵活,能够帮助开发者轻松实现定时任务的管理。在Java应用中,我们常常需要执行一些周期性的任务,如数据备份、清理缓存或者发送邮件等,而...
Quartz的Hibernate模型 博文链接:https://xmkevinchen.iteye.com/blog/196392
Quartz定时器是一款开源的、功能强大的作业调度框架,它为Java应用程序提供了精确且可扩展的任务调度能力。在Java世界中,Quartz以其灵活性、稳定性和广泛的社区支持而备受推崇。2.2.1版本是Quartz的一个稳定版本,...
在这个基础的Quartz定时器案例中,我们将探讨如何使用Quartz API来创建、配置和执行定时任务。 首先,Quartz的核心组件包括Job(任务)、Trigger(触发器)和Scheduler(调度器)。Job是实际需要执行的任务,...
本资料包将详细介绍如何在Spring框架中配置和使用Quartz定时器,并涉及到cron表达式的使用。 一、Quartz简介 Quartz是一个完全由Java编写的作业调度框架,能够精确地调度任务,支持简单或复杂的调度需求。Quartz的...
#### 一、Quartz定时器概述 ##### 特点: 1. **灵活性**:Quartz能嵌入到任何独立的应用中运行,无论是桌面应用程序还是服务器端应用。 2. **事务支持**:Quartz能够在应用服务器或Servlet容器中实例化,并且能够...
Quartz定时器是一款强大且灵活的开源作业调度框架,它允许开发者在Java应用程序中安排复杂的任务执行。Quartz不依赖任何特定的Web或应用服务器框架,因此可以独立使用,这正是"quartz定时器不依赖任何框架"这个主题...
quartz定时器mysql的脚本,如果需要定时器持久化到数据库,可以使用
Spring Quartz定时器是一种在Java应用中实现定时任务的流行框架,它允许开发者精确地调度任务执行。本篇文章将深入探讨如何在Spring框架中简单实现Quartz定时器,并结合源码和工具来帮助理解其工作原理。 首先,让...