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。
quartz.net时间表达式-----Cron表达式详解

时间表达式-----Cron表达式详解序⾔Cron表达式:就是⽤简单的xxoo符号按照⼀定的规则,就能把各种时间维度表达的淋漓尽致,⽆所不在其中,然后在⽤来做任务调度(定时服务)的中所认知执⾏,可想⽽知这是多么的天⾐⽆缝,说是编码艺术凝集⼀点不过分。
⽜逼吹完啦,我就写⼏个简单的cron表达式欣赏下:1、0/20 * * * * ? note:每20秒2、15 0/2 * * * ?note:每⼩时从0分钟开始,每2分钟的第15秒,假如当前时间是20:00:00,那么他的维度就在:20:02:5,20:04:15,20:06:15 ....3、0 0/2 17-21 * * ?note: 每天的下午5点到晚上9点,每隔2分中的第00秒,假如当前时间是20:24:52 ,那么他的时间维度在:20:26:00,20:28:00,20:30:00 ...看到Cron表达式的简洁与强⼤并存,忍不住往下深⼊,GoCron表达式的符号、格式表格表1、cron表达式特殊字符意义⽰意表特殊字符意义*匹配所有的值。
如:*在分钟的字段域⾥表⽰每分钟只在⽇期域和星期域中使⽤。
它被⽤来指定“⾮明确的值”-指定⼀个范围。
如:“10-12”在⼩时域意味着“10点、11点、12点”,指定⼏个可选值。
如:“MON,WED,FRI”在星期域⾥表⽰“星期⼀、星期三、星期五”/指定增量。
如:“0/15”在秒域意思是没分钟的0,15,30和45秒。
“5/15”在分钟域表⽰没⼩时的5,20,35和50。
符号“*”在“/”前⾯(如:*/10)等价于0在“/”前⾯(如:0/10)L表⽰day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表⽰⼀个⽉的最后⼀天。
如果在day-of-week域表⽰‘7’或者‘SAT’,如果在day-of-week域中前⾯加上数字,它表⽰⼀个⽉的最后⼏天,例如‘6L’就表⽰⼀个⽉的最后⼀个星期五W只允许⽇期域出现。
quartz定时任务cron表达式详解

quartz定时任务cron表达式详解cron表达式⽤于配置cronTrigger的实例。
cron表达式实际上是由七个⼦表达式组成。
这些表达式之间⽤空格分隔。
1.Seconds (秒)2.Minutes(分)3.Hours(⼩时)4.Day-of-Month (天)5.Month(⽉)6.Day-of-Week (周)7.Year(年)例:"0 0 12 ? * WED” 意思是:每个星期三的中午12点执⾏。
个别⼦表达式可以包含范围或者列表。
例如:上⾯例⼦中的WED可以换成"MON-FRI","MON,WED,FRI",甚⾄"MON-WED,SAT"。
⼦表达式范围:1.Seconds (0~59)2.Minutes (0~59)3.Hours (0~23)4.Day-of-Month (1~31,但是要注意有些⽉份没有31天)5.Month (0~11,或者"JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV,DEC")6.Day-of-Week (1~7,1=SUN 或者"SUN, MON, TUE, WED, THU, FRI, SAT”)7.Year (1970~2099)Cron表达式的格式:秒分时⽇⽉周年(可选)。
字段名允许的值允许的特殊字符秒 0-59 , - * /分 0-59 , - * /⼩时 0-23 , - * /⽇ 1-31 , - * ? / L W C⽉ 1-12 or JAN-DEC , - * /周⼏ 1-7 or SUN-SAT , - * ? / L C #年(可选字段) empty 1970-2099 , - * /字符含义:* :代表所有可能的值。
因此,“*”在Month中表⽰每个⽉,在Day-of-Month中表⽰每天,在Hours表⽰每⼩时- :表⽰指定范围。
quartz cron 表达式判断条件

quartz cron 表达式判断条件摘要:1.介绍quartz cron 表达式2.quartz cron 表达式的构成3.判断条件4.具体示例正文:## 1.介绍quartz cron 表达式Quartz 是一个流行的开源任务调度框架,它允许用户通过cron 表达式来定义任务的执行时间。
cron 表达式是一种基于Unix 的定时任务表达式,它可以用来配置任务的执行间隔和执行时间。
## 2.quartz cron 表达式的构成一个典型的quartz cron 表达式由以下几个部分组成:- 分钟(0-59)- 小时(0-23)- 天数(1-31)- 月份(1-12)- 星期几(0-7,0 表示星期日,1 表示星期一,以此类推)这些部分之间用空格隔开,构成了一个完整的cron 表达式。
例如,"0/15 * * * *"表示每15 分钟执行一次。
## 3.判断条件在quartz 中,可以通过cron 表达式来判断任务的执行条件。
具体来说,quartz 会比较当前时间和任务的cron 表达式,如果当前时间符合cron 表达式,那么任务就会被执行。
## 4.具体示例假设我们有一个任务,它的执行条件是每小时执行一次,我们可以通过以下cron 表达式来定义这个任务:```0 */1 * * *```这个表达式的意思是,每小时的第0 分钟执行任务。
例如,如果当前时间是10:00,那么这个任务就会在10:00 执行。
如果当前时间是10:30,那么这个任务就不会执行,因为已经过了每小时的第0 分钟。
这就是如何使用quartz cron 表达式来判断任务的执行条件。
Spring Quartz 定时任务

使用Quartz调度器Quartz调度器为调度工作提供了更丰富的支持。
和Java定时器一样,可以使用Quartz来每隔多少毫秒执行一个工作。
但Quartz比Java Timer更先进之处在于它允许你调度一个工作在某个特定的时间或日期执行。
创建一个类来定义工作定义Quartz工作的第一步是创建一个类来定义工作。
要做到这一点,你需要从Spring的QuartzJobBean中派生子类,如程序清单7.3所示:程序清单7.3 定义一个Quartz工作public class EmailReportJob extends QuartzJobBean {public EmailReportJob() {}protected void executeInternal(JobExecutionContext context)throws JobExecutionException {courseService.sendCourseEnrollmentReport();}private CourseService courseService;public void setCourseService(CourseService courseService) {this.courseService = courseService;}}<bean id="reportJob"class="org.springframework.scheduling.quartz.JobDetailBean" ><property name="jobClass"><value>xxx.xxx.EmailReportJob</value></property><property name="jobDataAsMap"><map><entry key="courseService"><ref bean="courseService"/></entry></map></property></bean>值得注意的是,在这里你并没有直接声明一个EmailReportJob Bean,而是声明了一个JobDetailBean。
java 定时任务 每隔40分钟执行一次的cron表达式

java 定时任务每隔40分钟执行一次的cron表达式
在Java中,如果你需要创建一个定时任务,使其每隔40分钟执行一次,你可以使用Quartz 框架或Spring框架中的定时任务支持。
以下是一个Cron表达式,可以用于描述每隔40分钟执行一次的定时任务:
```plaintext
0 */40 * * * ?
```
这个Cron表达式的含义如下:
- `0`:表示秒钟部分为0。
- `*/40`:表示每隔40分钟执行一次。
- `*`:表示每小时都执行。
- `*`:表示每天都执行。
- `*`:表示每月都执行。
- `?`:表示不指定特定的日期。
请注意,Quartz和Spring框架的Cron表达式可能有一些差异,具体取决于你使用的框架和版本。
上述表达式适用于大多数情况,但在使用时,建议查阅相关框架的文档以确保表达式的正确性。
quartz时间表达式Cron详解

quartz时间表达式Cron详解cron的表达式被⽤来配置CronTrigger实例。
cron的表达式是字符串,实际上是由七⼦表达式,描述个别细节的时间表。
这些⼦表达式是分开的空⽩,代表:SecondsMinutesHoursDay-of-MonthMonthDay-of-WeekYear (可选字段)例 "0 0 12 ? * WED" 在每星期三下午12:00 执⾏,个别⼦表达式可以包含范围;例如,在前⾯的例⼦⾥("WED")可以替换成 "MON-FRI", "MON, WED, FRI"甚⾄"MON-WED,SAT".“*” 代表整个时间段.每⼀个字段都有⼀套可以指定有效值,如Seconds (秒) :可以⽤数字0-59 表⽰,Minutes(分) :可以⽤数字0-59 表⽰,Hours(时) :可以⽤数字0-23表⽰,Day-of-Month(天) :可以⽤数字1-31 中的任⼀⼀个值,但要注意⼀些特别的⽉份Month(⽉) :可以⽤0-11 或⽤字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表⽰Day-of-Week(每周) :可以⽤数字1-7表⽰(1 =星期⽇)或⽤字符⼝串“SUN, MON, TUE, WED, THU, FRI and SAT”表⽰ “*”:指定所有的值,⽐如,Minutes 设置为 *,表⽰每分钟“/”:为特别单位,表⽰为“每”如“0/15”表⽰每隔15分钟执⾏⼀次,“0”表⽰为从“0”分开始, “3/20”表⽰表⽰每隔20分钟执⾏⼀次,“3”表⽰从第3分钟开始执⾏ “?”:表⽰每⽉的某⼀天,或第周的某⼀天 “L”:⽤于每⽉,或每周,表⽰为每⽉的最后⼀天,或每个⽉的最后星期⼏如“6L”表⽰“每⽉的最后⼀个星期五” “W”:表⽰为最近⼯作⽇,如“15W”放在每⽉(day-of-month)字段上表⽰为“到本⽉15⽇最近的⼯作⽇” “#”:是⽤来指定“的”每⽉第n个⼯作⽇,例在每周(day-of-week)这个字段中内容为"6#3" or "FRI#3" 则表⽰“每⽉第三个星期五”注意: Day-of-Month 和 Day-of-Week不可同时为 *,否则报错:ng.RuntimeException: CronExpression '0/2 * * * * * *' is invalid.at org.quartz.CronScheduleBuilder.cronSchedule(CronScheduleBuilder.java:111)at quartz.QuartzExample.getTrigger(QuartzExample.java:110)at quartz.QuartzExample.run(QuartzExample.java:74)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at ng.reflect.Method.invoke(Method.java:606)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)Caused by: java.text.ParseException: Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.at org.quartz.CronExpression.buildExpression(CronExpression.java:511)at org.quartz.CronExpression.<init>(CronExpression.java:276)at org.quartz.CronScheduleBuilder.cronSchedule(CronScheduleBuilder.java:107)... 25 moreDisconnected from the target VM, address: '127.0.0.1:61437', transport: 'socket'Process finished with exit code -1CronExpression 源码:protected void buildExpression(String expression) throws ParseException {expressionParsed = true;try {if (seconds == null) {seconds = new TreeSet<Integer>();}if (minutes == null) {minutes = new TreeSet<Integer>();}if (hours == null) {hours = new TreeSet<Integer>();}if (daysOfMonth == null) {daysOfMonth = new TreeSet<Integer>();}if (months == null) {months = new TreeSet<Integer>();}if (daysOfWeek == null) {daysOfWeek = new TreeSet<Integer>();}if (years == null) {years = new TreeSet<Integer>();}int exprOn = SECOND;StringTokenizer exprsTok = new StringTokenizer(expression, " \t",false);while (exprsTok.hasMoreTokens() && exprOn <= YEAR) {String expr = exprsTok.nextToken().trim();// throw an exception if L is used with other days of the monthif(exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) {throw new ParseException("Support for specifying 'L' and 'LW' with other days of the month is not implemented", -1); }// throw an exception if L is used with other days of the weekif(exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) {throw new ParseException("Support for specifying 'L' with other days of the week is not implemented", -1);}if(exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') +1) != -1) {throw new ParseException("Support for specifying multiple \"nth\" days is not implemented.", -1);}StringTokenizer vTok = new StringTokenizer(expr, ",");while (vTok.hasMoreTokens()) {String v = vTok.nextToken();storeExpressionVals(0, v, exprOn);}exprOn++;}if (exprOn <= DAY_OF_WEEK) {throw new ParseException("Unexpected end of expression.",expression.length());}if (exprOn <= YEAR) {storeExpressionVals(0, "*", YEAR);}TreeSet<Integer> dow = getSet(DAY_OF_WEEK);TreeSet<Integer> dom = getSet(DAY_OF_MONTH);// Copying the logic from the UnsupportedOperationException belowboolean dayOfMSpec = !dom.contains(NO_SPEC);boolean dayOfWSpec = !dow.contains(NO_SPEC);if (!dayOfMSpec || dayOfWSpec) {if (!dayOfWSpec || dayOfMSpec) {throw new ParseException("Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.", 0); }}} catch (ParseException pe) {throw pe;} catch (Exception e) {throw new ParseException("Illegal cron expression format ("+ e.toString() + ")", 0);}}CronExpression 部分代码1)Cron表达式的格式:秒分时⽇⽉周年(可选)。
【spring-boot】springboot整合quartz实现定时任务

【spring-boot】springboot整合quartz实现定时任务在做项⽬时有时候会有定时器任务的功能,⽐如某某时间应该做什么,多少秒应该怎么样之类的。
spring⽀持多种定时任务的实现。
我们来介绍下使⽤spring的定时器和使⽤quartz定时器 1.我们使⽤spring-boot作为基础框架,其理念为零配置⽂件,所有的配置都是基于注解和暴露bean的⽅式。
2.使⽤spring的定时器: spring⾃带⽀持定时器的任务实现。
其可通过简单配置来使⽤到简单的定时任务。
@Component@Configurable@EnableSchedulingpublic class ScheduledTasks{@Scheduled(fixedRate = 1000 * 30)public void reportCurrentTime(){System.out.println ("Scheduling Tasks Examples: The time is now " + dateFormat ().format (new Date ()));}//每1分钟执⾏⼀次@Scheduled(cron = "0 */1 * * * * ")public void reportCurrentByCron(){System.out.println ("Scheduling Tasks Examples By Cron: The time is now " + dateFormat ().format (new Date ()));}private SimpleDateFormat dateFormat(){return new SimpleDateFormat ("HH:mm:ss");}}没了,没错,使⽤spring的定时任务就这么简单,其中有⼏个⽐较重要的注解: @EnableScheduling:标注启动定时任务。
Spring+Quartz实现定时任务的配置方法

1、Scheduler的配置说明:Scheduler包含一个Trigger列表,每个Trigger表示一个作业。
2、Trigger的配置说明:1)Cron表达式的格式:秒分时日月周年(可选)。
字段名允许的值允许的特殊字符秒0-59 , - * /分0-59 , - * /小时0-23 , - * /日1-31 , - * ? / L W C月1-12 or JAN-DEC , - * /周几1-7 or SUN-SAT , - * ? / L C #年(可选字段) empty, 1970-2099 , - * /“?”字符:表示不确定的值“,”字符:指定数个值“-”字符:指定一个值的范围“/”字符:指定一个值的增加幅度。
n/m表示从n开始,每次增加m“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X“W”字符:指定离给定日期最近的工作日(周一到周五)“#”字符:表示该月第几个周X。
6#3表示该月第3个周五2)Cron表达式范例:每隔5秒执行一次:*/5 * * * * ?每隔1分钟执行一次:0 */1 * * * ?每天23点执行一次:0 0 23 * * ?每天凌晨1点执行一次:0 0 1 * * ?每月1号凌晨1点执行一次:0 0 1 1 * ?每月最后一天23点执行一次:0 0 23 L * ?每周星期天凌晨1点实行一次:0 0 1 ? * L在26分、29分、33分执行一次:0 26,29,33 * * * ?每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?3、JobDetail的配置4、业务类的配置<bean id="testJob" class="com.cjm.web.service.quartz.TestJob"/>5、业务类源代码说明:业务类不需要继承任何父类,也不需要实现任何接口,只是一个普通的java类。
Spring++:定时任务Cron表达式详解

Spring++:定时任务Cron表达式详解⼀、语法 Cron表达式是⼀个字符串,从Spring4.x版本后,不再进⾏年份的⽀持。
该字符串以5个空格隔开,分为6个域,每⼀个域代表⼀个含义。
语法如下: seconds minutes hours daysOfMonth months daysOfWeek 有兴趣的同学可以参考Cron表达式解析类:org.springframework.scheduling.support.CronSequenceGenerator⼆、pattern每隔域说明字段名含义 允许的值允许的特殊字符seconds 秒 0-59 , - * /minutes 分 0-59 , - * /hours ⼩时 0-23 , - * /daysOfMonth ⽇ 1-31 , - * ? / L W Cmonths ⽉ 1-12 or JAN-DEC , - * /daysOfWeek 周⼏ 1-7 or SUN-SAT , - * ? / L C #三、特殊字符说明 * :可⽤在所有字段中,表⽰对应时间域的每⼀个时刻,例如,*在分钟字段时,表⽰“每分钟”; ?:只能⽤在DayofMonth和DayofWeek两个域。
它也匹配域的任意值,但实际不会。
因为DayofMonth和 DayofWeek会相互影响。
例如想在每⽉的20⽇触发调度,不管20⽇到底是星期⼏,则只能使⽤如下写法: 13 13 15 20 * ?, 其中最后⼀位只能⽤? ⽽不能使⽤*,如果使⽤*表⽰不管星期⼏都会触发,实际上并不是这样 -:表达⼀个范围,如在⼩时字段中使⽤“10-12”,则表⽰从10到12点,即10,11,12; ,:表达⼀个列表值,如在星期字段中使⽤“MON,WED,FRI”,则表⽰星期⼀,星期三和星期五; /: x/y表达⼀个等步长序列,x为起始值,y为增量步长值。
如在分钟字段中使⽤0/15,则表⽰为0,15,30和45秒,⽽5/15在分钟字段中表⽰5,20,35,50,你也可以使⽤*/y,它等同于0/y; L: 该字符只在⽇期和星期字段中使⽤,代表“Last”的意思,但它在两个字段中意思不同。
摆脱Spring定时任务的@Scheduledcron表达式的困扰

摆脱Spring定时任务的@Scheduledcron表达式的困扰一、背景二、Cron表达式详解【1】cron表达式至少要有6个(最多有7个)以空格分割的事件元素。
按照从左到右的顺序,它们分别为:1.秒:Seconds{0~59}{特殊字符:, - * /}2.分:Minutes{0~59}{特殊字符:, - * /}3.时:Hours{0~23}{特殊字符:, - * /}4.天(月):DayofMonth{0~31}{特殊字符:, - * / ? L W C}5.月:Month{1~12或JAN(1)~DEC(12)}{特殊字符:, - * /}6.天(星期):DayofWeek{1~7 或SUN(1),MON(2),TUE(3),WED(4),THU(5),FRI(6),SAT(7)}{特殊字符:, - * / ? L C #}7.年份(可选):Year{留空,1970~2099}{特殊字符:, - * /}【2】特殊字符解析:•'*'字符代表所有可能的值.例如,'*'在子表达式(月)里表示每个月的含义,'*'在子表达式(天(星期))表示星期的每一天.•'/'字符用来指定数值的增量.例如:在子表达式(分钟)里的'0/15'表示从第0分钟开始,每15分钟.在子表达式(分钟)里的'3/20'表示从第3分钟开始,每20分钟(它和'3,23,43')的含义一样.•'?'字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值.当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为'?'.•'-'字符表示区间.例如,在子表达式(时)里,'9-12'表示每天9时到12时区间内.•','字符用来分割不同的值.例如.在子表达式(分)里,'3,6,9'表示每小时的3分、6分、9分.•'L'字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写,但是它在两个子表达式里的含义是不同的.在天(月)子表达式中,'L'表示一个月的最后一天.在天(星期)自表达式中,'L'表示一个星期的最后一天,也就是SAT.注:如果在“L”前有具体的内容,它就具有其他的含义了(在使用“L”参数时,不要指定列表或范围,因为这会导致问题).例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五.•'W'表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。
- 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触发。