Spring集成Quartz定时任务框架介绍和Cron表达式详解
Quartz学习--quartz基本介绍和Cron表达式

Quartz学习--quartz基本介绍和Cron表达式表名称说明qrtz_blob_triggers Trigger作为Blob类型存储(⽤于Quartz⽤户⽤JDBC创建他们⾃⼰定制的Trigger类型,JobStore 并不知道如何存储实例的时候)qrtz_calendars以Blob类型存储Quartz的Calendar⽇历信息, quartz可配置⼀个⽇历来指定⼀个时间范围负责执⾏向QuartzScheduler注册的触发Trigger的⼯作线程ThreadPool :Scheduler使⽤⼀个线程作为任务运⾏的基础设施,任务通过共享线程池中的线程提⾼运⾏效率QuartzSchedulerResources :包含穿件QuartzScheduler实例所需的所有资源(JobStore,ThreadPool等)JobStore :通过类实现的接⼝,这些类要为org.quartz.core.QuartzScheduler的使⽤提供⼀个org.quartz.Job和org.quartz.Trigger存储机制.作业和触发器的存储应该以其名称和组的组合为唯⼀性QuartzScheduler :Quartz的核⼼,他是org.quartz.Scheduler接⼝的间接实现,包含调度org.quartz.Jobs ,注册org.quartz.JobListener实例等的⽅法Scheduler :这是Quartz Scheduler的主要接⼝,代表⼀个独⽴运⾏容器. 调度程序维护JobDetails和触发器的注册表.⼀旦注册,调度程序负责执⾏作业,当她们的相关连的触发器触发(当她们的预定时间到达时 )Trigger:具有所有触发器通⽤属性的基本接⼝,描述了job执⾏的时间触发规则,使⽤TriggerBuilder实例化实际触发器JobDetail :传递给定作业实例的详细信息属性.JobDetails将使⽤JobBuilder创建/定义Job :表⽰要执⾏的"作业"的类的实现接⼝.只有⼀个⽅法:void execute(JobExecutionContext context);(JobExecutionContext 提供调度上下⽂各种信息,运⾏时数据保存在jobDataMap中 )Job 有个⼦接⼝StatefulJob,代表没有状态任务有状态任务不可并发,前次任务没有执⾏完,后⾯任务则⼀直处于阻塞等待状态2. ⼀个job可以被多个Trigger 绑定,但是⼀个Trigger只能绑定⼀个job!7. quartz.properties Quartz可更改配置//调度标识名集群中每⼀个实例都必须使⽤相同的名称(区分特定的调度器实例)org.quartz.scheduler.instanceName:DefaultQuartzScheduler//ID设置为⾃动获取每⼀个必须不同(所有调度器实例中是唯⼀的)org.quartz.scheduler.instanceId :AUTO//数据保存⽅式为持久化org.quartz.jobStore.class :org.quartz.impl.jdbcjobstore.JobStoreTX//表的前缀org.quartz.jobStore.tablePrefix : QRTZ_//设置为TRUE不会出现序列化⾮字符串类到 BLOB 时产⽣的类版本问题//eProperties : true//加⼊集群 true 为集群 false不是集群org.quartz.jobStore.isClustered : false//调度实例失效的检查时间间隔org.quartz.jobStore.clusterCheckinInterval:20000//容许的最⼤作业延长时间org.quartz.jobStore.misfireThreshold :60000//ThreadPool 实现的类名org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool//线程数量org.quartz.threadPool.threadCount : 10//线程优先级org.quartz.threadPool.threadPriority : 5(threadPriority 属性的最⼤值是常量 ng.Thread.MAX_PRIORITY,等于10。
使用SpringQuartz执行定时任务的表达式

使用SpringQuartz执行定时任务的表达式使用Spring Quartz执行定时任务的表达式附:cronExpression配置说明一个Cron-表达式是一个由六至七个字段组成由空格分隔的字符串,其中6个字段是必须的而一个是可选的,如下:字段名允许的值允许的特殊字符字段允许值允许的特殊字符秒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触发。
springboot整合quartz定时器实现定时任务详解

springboot整合quartz定时器实现定时任务详解quartz和TimerTask的区别:timer是jdk⾃带的(可想⽽知,肯定是不怎么好⽤)。
Quartz可以通过cron表达式精确到特定时间执⾏,⽽TimerTask不能。
Quartz拥有TimerTask所有的功能,⽽TimerTask则没有。
学习quartz需要知道的⼏个概念下⾯的概念来⾃⽹上,有点长,没关系,不愿意看可以跳过,下⾯有我个⼈理解精简版Job:是⼀个接⼝,只有⼀个⽅法void execute(JobExecutionContext context),开发者实现该接⼝定义运⾏任务,JobExecutionContext类提供了调度上下⽂的各种信息。
Job运⾏时的信息保存在JobDataMap实例中;JobDetail:Quartz在每次执⾏Job时,都重新创建⼀个Job实例,所以它不直接接受⼀个Job的实例,相反它接收⼀个Job实现类,以便运⾏时通过newInstance()的反射机制实例化Job。
因此需要通过⼀个类来描述Job的实现类及其它相关的静态信息,如Job名字、描述、关联监听器等信息,JobDetail承担了这⼀⾓⾊。
Trigger:是⼀个类,描述触发Job执⾏的时间触发规则。
主要有SimpleTrigger和CronTrigger这两个⼦类。
当仅需触发⼀次或者以固定时间间隔周期执⾏,SimpleTrigger是最适合的选择;⽽CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度⽅案:如每早晨9:00执⾏,周⼀、周三、周五下午5:00执⾏等;Calendar:org.quartz.Calendar和java.util.Calendar不同,它是⼀些⽇历特定时间点的集合(可以简单地将org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表⼀个⽇历时间点,⽆特殊说明后⾯的Calendar即指org.quartz.Calendar)。
Quartz任务调度说明 CronTrigger + Spring

触发器中两个重要的触发器1,SimpleTrigger :可以精确到毫秒,如果需要让任务只在某个时刻执行一次,或者,在某个时刻开始,然后按照某个时间间隔重复执行例如:public SimpleTrigger(String name, //名称String group, //组名Date startTime, //开始时间Date endTime, //结束时间(控制权高于重复次数属性)为null时直到永远int repeatCount, //重复次数(可能是0)long repeatInterval) //重复间隔(以毫秒为单位)2,CronTrigger :像日历那样按日程来触发任务。
可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。
也可以像SimpleTrigger一样,CronTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续.Cron表达式被用来配置CronTrigger实例.Cron表达式是一个由7个子表达式组成的字符串。
每个子表达式都描述了一个单独的日程细节。
这些子表达式用空格分隔,分别表示:秒分钟小时月中的天天周中的天年秒---例如:3/5从第3秒开始每隔5秒触发一次通配符('*')可以被用来表示域中“每个”可能的值'?'字符可以用在day-of-month及day-of-week域中,它用来表示“没有指定值”。
'L'字符可以在day-of-month及day-of-week中使用,L是last的缩写。
如时在day-of-month 中L表示的月的最后一天。
在day-of-week中,表示"当月的最后的周XXX",例如:"6L" 或者"FRIL"都表示本月的最后一个周五。
quartz的cron表达式

quartz的cron表达式Quartz的Cron表达式简介1. 什么是Cron表达式Cron表达式是一种用于定时任务调度的标准格式。
在Quartz框架中,Cron表达式被广泛使用,用于设置任务的执行时间。
2. Cron表达式的语法Cron表达式由6个或7个字段组成,每个字段代表时间的一个维度。
这6个或7个字段分别是:•秒(0~59)•分钟(0~59)•小时(0~23)•日(1~31)•月(1~12)•周几(0~7,0和7都代表周日)可以使用通配符或范围来表示时间的不确定性。
例如,“*“代表所有可能的值,”?“在日和周几字段中代表不指定值,”-“用来表示范围,” / “用来表示递增间隔。
例如,要设置每天早上9点执行任务,Cron表达式可以是0 0 9 ? * *。
3. 常用的Cron表达式示例以下是一些常见的Cron表达式示例:•0 0/5 * * * ?表示每隔5分钟执行一次任务。
•0 0 12 * * ?表示每天中午12点执行任务。
•0 0 8 ? * MON-FRI表示周一到周五每天早上8点执行任务。
•0 0 8 ? * 6L表示每个月的最后一个周五早上8点执行任务。
4. Cron表达式的高级用法Cron表达式还支持一些高级功能,例如使用”#“指定月份中的第几个周几,使用”L”指定月份中的最后一天,使用”W”指定平日最近的工作日等等。
以下是一些高级用法的示例:•0 0 12 ? JAN,FEB,DEC *表示一月、二月和十二月每天中午12点执行任务。
•0 0/30 9-17 * * MON-FRI#2表示周一到周五上午9点到下午5点之间,每隔30分钟执行一次任务,并且每个月的第二个周一符合条件。
5. 总结Cron表达式是Quartz框架中用于指定任务执行时间的标准格式。
它非常灵活,并且支持多种时间维度的设置。
掌握Cron表达式的语法和常用示例,可以帮助我们轻松实现定时任务的调度。
6. Cron表达式的注意事项在使用Cron表达式时,需要注意以下几点:•时间表达式字段之间使用空格分隔。
Quartz及Cron表达式

Quartz及Cron表达式QuartzQuartz是一个完全由java编写的开源作业调度框架.Quartz最主要的功能就是调度器(完成定时任务),可以与javaEE 或者javaSE应用程序相结合也可以单独使用。
Quartz能借助关系数据库和JDBC作业存储支持集群,负载均衡。
Spring QuartzSpring中继承并简化了Quartz, 我们可以通过配置Spring简化Quartz的配置。
在ApplicationContext.xml配置数据源,并且引入ApplicationContext-quartz.xml文件。
ApplicationContext.xml:Xml代码1.<bean id="dataSource" class="org.springframework.jndi. JndiObjectFactoryBean">2.<property name="jndiName" value="java:comp/env/jdbc /publicdb"></property>3.</bean>4..5..6..7..8.<!-- import -->9.<import resource="ApplicationContext-quartz.xml" />[xml] view plain copy1.<bean id="dataSource" class="org.springframework.jndi. JndiObjectFactoryBean">2.<property name="jndiName" value="java:comp/env/jdbc/publicdb"></property>3.</bean>4..5..6..7..8.<!-- import -->9.<import resource="ApplicationContext-quartz.xml" />ApplicationContext-quartz.xml:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "/dtd/spring-beans.dtd"> 3.4.<beans default-autowire="byName">5.<!-- 要调用的工作类 -->6.<bean id="reportCreateJob" class="org.quartz.JobDetail" >7.<property name="jobClass">8.<value>com.hundsun.u3c.reportserver.quartz.job.Report CreateJob</value>9.</property>10.<property name="name" value="reportCreate-processor-job" />11.</bean>12.<!-- 定义触发时间 -->13.<bean id="reportCreateTrigger" class="org.springfra mework.scheduling.quartz.CronTriggerBean">14.<property name="jobDetail">15.<ref bean="reportCreateJob" />16.</property>17.<property name="cronExpression">18.<value>0 * * * * ?</value>19.</property>20.</bean>21.<!-- 管理类:配置Schedule信息,与spring容器的生命周期建立联系等功能 -->22.<bean id="scheduler"23.class="org.springframework.scheduling.quartz.Schedu lerFactoryBean">24.<property name="dataSource" ref="dataSource" />25.<!-- 在SchedulerFactoryBean初始化完成后,延迟300秒启动Scheduler,以便让Spring能够更快初始化容器中剩余的Bean。
java中spring与Quartz 整合定时任务

现在想要获得在特定时间或者指定时间执行相应功能有两种做法在applicationContext.xml中写入如下Bean<bean id="repeatingTrigger"class="org.springframework.scheduling.timer.ScheduledTimerTask"> <!--启动一秒后执行 --><property name="delay"><value>1000</value></property><!--每隔一小时执行一次 --><property name="period"><value>3600000</value></property><!--注入要监控的javaBean --><property name="timerTask"><ref bean="task" /></property><!--类型是否为fixedRate型,默认为fixedDelay--><property name="fixedRate"><value>true</value></property></bean><bean id="scheduler"class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"><list><ref bean="repeatingTrigger" /></list></property></bean><bean id="task" class="com.css.wam.portlet.SampleTask"><property name="workService"><ref bean="workService" /></property><property name="work"><ref bean="work" /></property></bean>然后写SampleTask类,如下:package com.css.wam.portlet;import java.util.ArrayList;import java.util.Calendar;import java.util.Iterator;import java.util.List;import java.util.TimerTask;import javax.servlet.ServletContext; 字串2import org.apache.jetspeed.security.SecurityException; 字串9 import com.css.wam.service.WorkService; 字串1@SuppressWarnings("unused")class SampleTask extends TimerTask{ 字串2private static final int C_SCHEDULE_HOUR = 23;//设置指定时间private WorkService workService;private List users;private List teams;private WorkPortlet work;public void setWorkService(WorkService workService) {this.workService = workService;} 字串7public void setWork(WorkPortlet work) {this.work = work;} 字串4public SampleTask(){}@SuppressWarnings("unchecked")public void run() {Calendar cal = Calendar.getInstance();try {users = work.getUsers();teams = new ArrayList();for(Iterator it = users.iterator(); it.hasNext();){String teamname = work.getGroupsByUser((String)it.next()); teams.add(teamname);}//查看当前时间与指定是否一致,一致则执行任务if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY) ) 字串6workService.autoWorkOff(users, teams); 字串8} catch (SecurityException e) {e.printStackTrace();}}}使用Quartz定时<bean id="methodInvokingJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><ref bean="changeService"/></property><property name="targetMethod"><value>changeAll</value></property></bean><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><ref bean="methodInvokingJobDetail"/></property><property name="cronExpression"><!--<value>0 0 6,12,20 * * ?</value>--><value>0 0 23 * * ?</value></property></bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref local="cronTrigger"/></list></property></bean>简单定时<bean id="methodInvokingJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><ref bean="sgService"/></property><property name="targetMethod"><value>updateNowSgList</value></property></bean><bean id="simpleTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean"><property name="jobDetail"><ref bean="methodInvokingJobDetail"/></property><property name="startDelay"><value>10000</value> <!-- 10 s--></property><property name="repeatInterval"><value>1296000000</value> <!-- 1296000000 6 hours--></property></bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref local="simpleTrigger"/></list></property></bean>一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
spring定时任务(整合了quartz插件)

spring定时任务(整合了quartz插件)2009-09-29 10:08在applicationContext-quartz.xml中进行配置就可以了:(在spring-context-support.jar 包中)<!-- 要调用的工作类--><bean id="quartzJob"class="com.founder.sipossp.webapp.action.search.HotWordsAction"><property name="searchHotWordsService"><ref bean="searchHotWordsService"/></property><property name="searchIllegalWordsService"><ref bean="searchIllegalWordsService"/></property></bean><!-- 热词榜日更新--><!-- 定义调用对象和调用对象的方法--><bean id="dayJobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB ean"><!-- 调用的类--><property name="targetObject"><ref bean="quartzJob" /></property><!-- 调用类中的方法--><property name="targetMethod"><value>updateDayhotWordBase</value></property></bean><!-- 热词榜周更新--><!-- 定义调用对象和调用对象的方法--><bean id="weekJobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB ean"><!-- 调用的类--><property name="targetObject"><ref bean="quartzJob" /></property><!-- 调用类中的方法--><property name="targetMethod"><value>updateWeekhotWordBase</value></property></bean><!-- 热词榜月更新--><!-- 定义调用对象和调用对象的方法--><bean id="monthJobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB ean"><!-- 调用的类--><property name="targetObject"><ref bean="quartzJob" /></property><!-- 调用类中的方法--><property name="targetMethod"><value>updateMonthhotWordBase</value></property></bean><!-- 政府榜月更新--><!-- 定义调用对象和调用对象的方法--><bean id="govJobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB ean"><!-- 调用的类--><property name="targetObject"><ref bean="quartzJob" /></property><!-- 调用类中的方法--><property name="targetMethod"><value>updateGov</value></property></bean><!-- 政策榜月更新--><!-- 定义调用对象和调用对象的方法--><bean id="polJobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB ean"><!-- 调用的类--><property name="targetObject"><ref bean="quartzJob" /></property><!-- 调用类中的方法--><property name="targetMethod"><value>updatePol</value></property></bean><!-- 学术榜月更新--><!-- 定义调用对象和调用对象的方法--><bean id="sciJobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryB ean"><!-- 调用的类--><property name="targetObject"><ref bean="quartzJob" /></property><!-- 调用类中的方法--><property name="targetMethod"><value>updateSci</value></property></bean><!-- 总榜每日更新--><!-- 定义调用对象和调用对象的方法--><bean id="totalJobtask"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 调用的类--><property name="targetObject"><ref bean="quartzJob" /></property><!-- 调用类中的方法--><property name="targetMethod"><value>updateTotalHotWord</value></property></bean><!-- 定义每日触发时间日榜,总榜更新时间每日凌晨1点--> <bean id="doTimeDay"class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><ref bean="dayJobtask" /></property><!-- cron表达式--><property name="cronExpression"><value>0 0 1 ? * *</value></property></bean><bean id="doTimeTotal"class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><ref bean="totalJobtask" /></property><!-- cron表达式--><property name="cronExpression"><value>0 0 1 ? * *</value></property></bean><!-- 定义每周触发时间周榜更新时间每周1凌晨2点--><bean id="doTimeWeek"class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><ref bean="weekJobtask" /></property><!-- cron表达式--><property name="cronExpression"><value>0 0 2 ? * MON</value></property></bean><!-- 定义每月触发时间月榜更新时间每月1日凌晨3点--><bean id="doTimeMonth"class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><ref bean="monthJobtask" /></property><!-- cron表达式--><property name="cronExpression"><value>0 0 3 1 * ?</value></property></bean><!-- 定义政府,政策,学术每月更新时间每月1日凌晨3:30--> <bean id="doGov"class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><ref bean="govJobtask" /></property><!-- cron表达式--><property name="cronExpression"><value>0 30 3 1 * ?</value></property></bean><bean id="doPol"class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><ref bean="polJobtask" /></property><!-- cron表达式--><property name="cronExpression"><value>0 30 3 1 * ?</value></property></bean><bean id="doSci"class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><ref bean="sciJobtask" /></property><!-- cron表达式--><property name="cronExpression"><value>0 30 3 1 * ?</value></property></bean><!-- 总管理类如果将lazy-init='false'那么容器启动就会执行调度程序--> <bean id="startQuertz" lazy-init="false" autowire="no"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="doTimeDay" /><ref bean="doTimeWeek" /><ref bean="doTimeMonth" /><ref bean="doGov" /><ref bean="doPol" /><ref bean="doSci" /><ref bean="doTimeTotal" /></list></property></bean>Spring定时器,主要有两种实现方式,包括Java Timer定时和Quartz定时器!1.Java Timer定时首先继承java.util.TimerTask类实现run方法package nd;import java.util.Date;import java.util.TimerTask;public class TimerTest extends TimerTask {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("TimerTest"+(new Date()).toString());}}Spring配置<bean id="TimerTest" class="nd.TimerTest"></bean><bean id="TimerTestTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> <!-- wait 10 seconds before starting repeated execution --><property name="delay" value="10000" /><!-- 启动后的延迟时间--><!--间隔时间--><property name="period" value="72000" /><property name="timerTask" ref="TimerTest" /></bean><bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"><list><!-- see the example above --><ref bean="TimerTestTask" /></list></property></bean>2.Quartz定时器首先继承QuartzJobBean类实现executeInternal方法public class SchedulerTest extends QuartzJobBean{@Overrideprotected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { // TODO Auto-generated method stub//System.out.println("-----------");System.out.println("1111111"+(new Date()).toString());}}-------------------------------------------public class SchedulerTest2 extends QuartzJobBean{@Overrideprotected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {// TODO Auto-generated method stub//System.out.println("-----------");System.out.println("22222222"+(new Date()).toString());}}Spring配置<bean id="SchedulerTask" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"><value>nd.SchedulerTest</value></property></bean><bean id="SchedulerTask2" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"><value>nd.SchedulerTest2</value></property></bean><bean id="SchedulerTaskTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="SchedulerTask" /><property name="cronExpression"><value>0/10 * * * * ?</value></property></bean><bean id="SchedulerTaskTrigger2"class="org.springframework.scheduling.quartz.SimpleTriggerBean"><property name="jobDetail" ref="SchedulerTask2" /><property name="startDelay"><value>1000</value><!--延迟时间--></property><property name="repeatInterval"><value>20000</value><!--间隔时间--></property></bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"><list><ref bean="SchedulerTaskTrigger" /><ref bean="SchedulerTaskTrigger2" /></list></property></bean>3.其他说明Java Timer定时有一种配置启动的方org.springframework.scheduling.timer.ScheduledTimerTask,Quartz定时器有两种配置启动的方式:org.springframework.scheduling.quartz.SimpleTriggerBean,org.springframework.scheduling.quartz.CronTriggerBean。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等。
我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但时调度控制非常不方便,并且我们需要大量的代码。
使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成方法和Cron表达式的详细介绍。
一、增加所依赖的JAR包1、增加Spring的Maven依赖<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>3.0.5.RELEASE</version></dependency>2、增加Quartz的Maven依赖<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>1.8.4</version></dependency>二、增加定时业务逻辑类publicclass ExpireJobTask {/** Logger */privatestaticfinal Logger logger =LoggerFactory.getLogger(ExpireJobTask.class);/*** 业务逻辑处理*/publicvoid doBiz() {// 执行业务逻辑// ........}}ExpireJobTask业务逻辑类与一般普通的类没有任务区别,它定义的doBiz方法即为调度业务方法。
三、增加Spring配置1、增加一个线程池<!-- 线程执行器配置,用于任务注册 --><bean id="executor"class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecut or"><property name="corePoolSize" value="10"/><property name="maxPoolSize" value="100"/><property name="queueCapacity" value="500"/></bean>2、定义业务逻辑处理类<!-- 业务对象 --><bean id="bizObject"class="mon.toolkit.scheduling.ExpireJobTask"/>3、增加调度业务逻辑<!-- 调度业务 --><bean id="jobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailF actoryBean"><property name="targetObject" ref="bizObject"/><property name="targetMethod" value="doBiz"/></bean>上面的配置中,我们以bizObject.doBiz方法为将要调度的业务执行逻辑。
4、增加调度触发器<bean id="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="jobDetail"/><property name="cronExpression" value="10 0/1 * * * ?"/></bean>Cron表达式“10 */1 * * * ?”意为:从10秒开始,每1分钟执行一次。
<bean id="taskTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean"><property name="jobDetail" ref="jobDetail"/><property name="startDelay" value="10000"/><property name="repeatInterval" value="60000"/></bean>该调度表示,延迟10秒启动,然后每隔1分钟执行一次。
5、增加调度<!-- 设置调度 --><beanclass="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"><list><ref bean="cronTrigger"/></list></property><property name="taskExecutor" ref="executor"/></bean>triggers属性中,我们可以增加多个触发器。
到此,Spring已经与Quartz完美的结合了,我们接下来的工作就是启动系统,开始调度了。
四、Cron表达式的详细用法字段允许值允许的特殊字符秒0-59 , - * /分0-59 , - * /小时0-23 , - * /日期1-31 , - * ? / L W C月份1-12 或者JAN-DEC , - * /星期1-7 或者SUN-SAT , - * ? / L C #年(可选)留空, 1970-2099 , - * /例子:0/5 * * * * ?:每5秒执行一次“*”字符被用来指定所有的值。
如:"*"在分钟的字段域里表示“每分钟”。
“?”字符只在日期域和星期域中使用。
它被用来指定“非明确的值”。
当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。
看下面的例子你就会明白。
月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号来表明不想设置那个字段。
“-”字符被用来指定一个范围。
如:“10-12”在小时域意味着“10点、11点、12点”。
“,”字符被用来指定另外的值。
如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”。
“/”字符用于指定增量。
如:“0/15”在秒域意思是每分钟的0,15,30和45秒。
“5/15”在分钟域表示每小时的5,20,35和50。
符号“*”在“/”前面(如:*/10)等价于0在“/”前面(如:0/10)。
记住一条本质:表达式的每个数值域都是一个有最大值和最小值的集合,如:秒域和分钟域的集合是0-59,日期域是1-31,月份域是1-12。
字符“/”可以帮助你在每个字符域中取相应的数值。
如:“7/6”在月份域的时候只有当7月的时候才会触发,并不是表示每个6月。
L是…last‟的省略写法可以表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表示一个月的最后一天。
如果在day-of-week域表示…7‟或者…SAT‟,如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如…6L‟就表示一个月的最后一个星期五。
字符“W”只允许日期域出现。
这个字符用于指定日期的最近工作日。
例如:如果你在日期域中写“15W”,表示:这个月15号最近的工作日。
所以,如果15号是周六,则任务会在14号触发。
如果15好是周日,则任务会在周一也就是16号触发。
如果是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。
字符“W”只能配合一个单独的数值使用,不能够是一个数字段,如:1-15W是错误的。
“L”和“W”可以在日期域中联合使用,LW表示这个月最后一周的工作日。
字符“#”只允许在星期域中出现。
这个字符用于指定本月的某某天。
例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。
“2#1”表示本月第一周的星期一。
“4#5”表示第五周的星期三。
字符“C”允许在日期域和星期域出现。
这个字符依靠一个指定的“日历”。
也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历”关联,则等价于所有包含的“日历”。
如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。
星期域是“1C”表示关联“日历”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)。
五、表达式举例"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触发。