- 使用Quartz实现定时功能
-
-
Quartz是一个完全由java编写的开源作业调度框架,具体的介绍可到http:
-
- 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;
-
-
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>标签来指定。
-
- 由于quartz目前文档不是很多,大部分都是看源码。总体看Quartz提供的CronTrigger使用表达式方式描述定时规律这个功能还是很强大的,在其源码中有很多例子。
-
- spring已经把quartz集成在一起,并进行了封装,使用起来还是很方便的。
如果需要让任务只在某个时刻执行一次,或者,在某个时刻开始,然后按照某个时间间隔重复执行,简单地说,如果你想让触发器在2007年8月20日上午11:23:54秒执行,然后每个隔10秒钟重复执行一次,并且这样重复5次。那么SimpleTrigger 就可以满足你的要求。
通过这样的描述,你可能很惊奇地发现SimpleTrigger包括这些属性:开始时间,结束时间,重复次数,重复间隔。所有这属性都是你期望它所应具备的,只有end-time属性有一些条目与之关联。
重复次数可能是0,正数或者一个常量值SimpleTrigger.REPEAT_INDEFINITELY。重复间隔时间属性可能是0,正的long型,这个数字以毫秒为单位。注意:如果指定的重复间隔时间是0,那么会导致触发器按照‘重复数量’定义的次数并发触发(或者接近并发)。
Quartz.TriggerUtils类对处理这样的循环也提供了很多支持。
EndTime(如果这个属性被设置)属性会覆盖重复次数属性,这对创建一个每隔10秒就触发一次直到某个时间结束的触发器非常有用,这就可以不计算开始时间和结束时间之间的重复数量。也可以指定一个结束时间,然后使用REPEAT_INDEFINITELY作为重复数量。(甚至可以指定一个大于结束时间之前实际重复次数的整数作为重复次数)。一句话,EndTime属性控制权高于重复次数属性。
SimpleTrigger有几个不同的构造函数,下面我们来看看这结果构造函数:
One of SimpleTrigger's Constructors SimpleTrigger的未触发指令
public SimpleTrigger(string name,
string group,
DateTime startTime,
NullableDateTime endTime endTime,
int repeatCount,
long repeatInterval)
SimpleTrigger Example 1 - Create a trigger that fires exactly once, ten seconds from now
SimpleTrigger trigger = new SimpleTrigger("myTrigger",
null,
DateTime.Now.AddSeconds(10),
null,
0,
0L);
SimpleTrigger Example 2 - Create a trigger that fires immediately, then repeats every 60 seconds, forever
SimpleTrigger trigger2 = new SimpleTrigger("myTrigger",
null,
DateTime.Now,
null,
SimpleTrigger.REPEAT_INDEFINITELY,
60 * 1000);
SimpleTrigger Example 3 - Create a trigger that fires immediately, then repeats every 10 seconds until 40 seconds from now
SimpleTrigger trigger = new SimpleTrigger("myTrigger",
"myGroup",
DateTime.Now,
DateTime.Now.AddSeconds(40),
SimpleTrigger.REPEAT_INDEFINITELY,
10 * 1000);
SimpleTrigger Misfire Instructions——
“未触发”发生时,SimpleTrigger有几个指令可以用来通知Quartz进行相关处理。(“未触发”在上节课中介绍过了)。这些指令以常量形式定义在SimpleTrigger本身,这些指令如下:
Misfire Instruction Constants of SimpleTrigger
MISFIRE_INSTRUCTION_FIRE_NOW
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT
回顾前面的课程你可以知道,每个触发器都有一个Trigger.MISFIRE_INSTRUCTION_SMART_POLICY指令可用,并且,这个指令对于每个类型的触发器都是缺省的。
自由、创新、研究、探索……
分享到:
相关推荐
SimpleTrigger是Quartz中的一种基础触发器类型,用于执行一次性或按照特定间隔重复的任务。这篇博客文章(链接已提供)可能详细介绍了如何使用SimpleTrigger以及它的核心概念。 在Quartz中,Trigger是调度的核心...
本篇文章主要探讨scheduler中的两种主要触发器:SimpleTrigger和CronTrigger,以及它们的过时处理策略。 ### 1. Trigger接口与类型 Trigger是一个接口,它定义了触发Job执行的时间规则。主要有两个实现类: - **...
SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger", "triggerGroup-s1"); // 设置触发器的开始时间 simpleTrigger.setStartTime(new Date(System.currentTimeMillis())); // 设置重复间隔 ...
SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger", "triggerGroup-s1"); // 设置触发器的开始时间 simpleTrigger.setStartTime(new Date(ctime + 5000)); // 设置重复间隔 simpleTrigger....
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInMinutes(1) ...
本说明文档将详细解析两种常见的触发器:SimpleTrigger和CronTrigger的配置与使用。 首先,SimpleTrigger适用于那些需要简单定时任务的场景。例如,如果你想让某个任务在特定时间启动,并按设定的间隔重复执行,...
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10)...
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10...
SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1", "job1", new Date(ts), null, -1, 1000L); // 将 ‘job1’ 加入调度者中 scheduler.scheduleJob(jobDetail, simpleTrigger); // 开始运行调度...
SimpleTrigger适合于较为简单的定时任务需求,而CronTrigger则适用于更复杂的定时任务需求,如每周一的特定时间等。 #### 三、Quartz的基本使用 下面将详细介绍如何使用Quartz进行任务调度。 1. **环境准备**:...
标题中的 "固定时间间隔计划" 指的是使用 Quartz 的 SimpleTrigger 类来设置间隔时间执行任务的方式,而 "Calendar 和 Cron" 提到了另外两种时间触发器,它们提供了更复杂的调度策略。 1. **SimpleTrigger**: ...
SimpleTrigger trigger = new SimpleTrigger("myTrigger", "myGroup", startTime, null, 1, TimeInterval.minutes(1)); ``` 然后,我们创建Scheduler实例并安排Job的执行: ```java Scheduler scheduler = ...
SimpleTrigger允许你设置间隔时间执行,而CronTrigger则支持更复杂的定时规则,如按CRON表达式设定的日期和时间。 3. **Scheduler**:调度器是Quartz的中心管理角色,负责管理和执行所有的Job和Trigger。通过...
这里定义了一个 `SchedulerFactoryBean` 实例,并通过 `<property name="triggers">` 设置了触发器列表,其中包含了两个触发器:`simpleTrigger` 和 `cornTrigger`。 ##### 2. Trigger 的配置 - **SimpleTrigger**...
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10)...
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("helloTrigger", "group1") .startNow() .withSchedule(scheduleBuilder) .build(); ``` 3. 创建JobDetail,绑定Job类。 ...
Trigger simpleTrigger = TriggerBuilder.newTrigger() .withIdentity("simpleTrigger", "group1") .startNow() // 立即启动 .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInMinutes(1) ...
SimpleTrigger可以在指定时间点执行一次或者按照指定的时间间隔重复执行。CronTrigger则更灵活,它允许以cron表达式的形式指定复杂的时间规则。Quartz的配置和使用相对复杂一些,但提供了更加灵活的调度功能。 第三...
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10)...
7. **时间调度配置文档**:这份文档可能提供了关于如何配置和调整触发器的详细说明,包括如何设置CRON表达式,或者如何改变SimpleTrigger的重复频率。 通过研究这个Demo项目,开发者可以快速掌握Quartz.NET的核心...