使用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();
}
}
执行上面这个类基本实现了一个简单的定时程序。但问题是现在这个类只能应用在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集成在一起,并进行了封装,使用起来还是很方便的。
分享到:
相关推荐
Quartz定时功能在WebForm 以及 WinForm上使用时,需要引用相关的dll
本项目实现对quartz定时任务的增加、停止、恢复等功能。前端为jQuery+ bootstrap实现可视化操作,附带有mybatis分页插件应用
在spring+hibernate的框架中定时操作数据库,主要是拿到sessionFactory,不会出现no session 和transaction no-bound等问题,由sessionFactory完成对数据的操作,有些包是没有用的,有兴趣的可以自己删除掉
自己制作,保证好用,java语言,有quartz定时,暂停,继续,终止进程等多功能。
quartz和Timer的demo中没有用框架,很简单的例子,主要用于测试用的...
使用quartz定时器实现系统多活,可以实现很多功能,比如集群中的系统多活检测,多设备接入的时候为每个设备创建定时获取数据机制,利用Quartz设计采集系统并实现系统双活机制_在SpringCloud中自己设计系统双活
spring提供的定时发送邮件功能一直深受广大web开发者的喜爱,这篇文章主要介绍了Spring+quartz实现定时发送邮件功能实例,有兴趣的可以了解一下。
3、适应于spring 于quartz不能解决的场景 基本等价整合功能,满足实际应用场景(任务暂停、恢复等复杂功能不能应用); 4、可以对该demo工程进行扩展,实现在页面上定义任务开始执行时间、循环次数等。 4、附件中...
应用quartz实现了多任务并发执行,定时时间从数据库获取,并且能够在更改数据库执行时间后重新执行定时任务,实现了quartz定时任务的动态管理。本次为了实现功能,代码并未作优化,仅作参考借鉴之用。
Quartz是一个完全由java编写的开源作业调度框架,下面提供一个小例子供大家参考,还有在servlet配置的方法
APScheduler提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务,它是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能。
Spring 整合 Quartz 实现动态定时任务,最近项目中需要用到定时任务的功能,虽然Spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够...在考虑之后,决定整合更为专业的Quartz来实现定时任务功能。
真正动态,定时任务“0”开发,基于quartz集群超轻量级扩展实现。 不多说,先看效果 添加定时任务 编辑定时任务-修改定时规则 特点: 基于quartz集群,轻量扩展。可快速改造现有项目 完全动态管理,可自定义任何...
通过Quartz的API,自己实现了 添加JOB、删除、修改、暂停/恢复,停复机等的多种功能,已经可以满足基本项目的使用.
spring mvc quartz 动态设置时间,可以实现任务调度的暂停和重启,在页面实现一个功能,可以动态设置调度的表达式,可以开启暂停任务调度
在Spring中的定时任务功能,最好的办法当然是使用Quartz来实现。这篇文章主要介绍了基于spring+quartz的分布式定时任务框架实现,有兴趣的可以了解一下。
master分支上是使用springboot+quartz+mysql+kafka实现定制化定时任务功能 系统启动初始化加载已有的定时任务 启动or暂停定时任务 立即运行定时任务 实时新增及修改定时任务 定时任务的详细监控 博客地址: 注意此...
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。...Quartz在功能上远远超越了JDK自带的Timer,很好很强大!
最近项目中使用了spring+Quartz定时任务、但是项目最近要集群部署、多个APP下如何利用Quartz 协调处理任务。 大家可以思考一下、现在有 A、B、C三个应用同时作为集群服务器对外统一提供服务、每个应用下各有一个...