springquartz实现定时任务的配置方法

合集下载

Spring定时器的配置

Spring定时器的配置

Spring定时器的配置最近两个项⽬中都⽤到了定时器的功能,选择了spring的Quartz定时器,只需要在xml⽂件中配置后就可以启⽤,相对java中⽤继承java.util.TimerTask,实现run⽅法的定时器,感觉spring的Quartz定时器更加灵活,功能更加强⼤.配置⽅法如下:1.⾸先spring定时器要⽤到的jar包: spring-2.0.6.jar quartz-1.6.0.jar commons-logging-1.1.1.jar commons-collections-3.2.1.jar2.配置你要定时加载的⽬标类<bean id="BusinessTestTime" class=com.sanss.monitor.struts.action.pushAndReward"><property name="liNaDAO" ref="LiNaDAO"></property></bean>3.配置定时器详情<bean id="BusinessTestDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><ref bean="BusinessTestTime" /></property> <!-- 当指定多个Trigger时, 很可能第⼀个job完成之前第⼆个job就开始了。

指定concurrent设为false,多个job不会并发运⾏,第⼆个job 将不会在第⼀个job完成之前开始。

SpringBoot集成Quartz实现定时任务的方法

SpringBoot集成Quartz实现定时任务的方法

SpringBoot集成Quartz实现定时任务的⽅法1 需求在我的前后端分离的实验室管理项⽬中,有⼀个功能是学⽣状态统计。

我的设计是按天统计每种状态的⽐例。

为了便于计算,在每天0点,系统需要将学⽣的状态重置,并插⼊⼀条数据作为⼀天的开始状态。

另外,考虑到学⽣的请假需求,请假的申请往往是提前做好,等系统时间⾛到实际请假时间的时候,系统要将学⽣的状态修改为请假。

显然,这两个⼦需求都可以通过定时任务实现。

在⽹上略做搜索以后,我选择了⽐较流⾏的定时任务框架Quartz。

2 QuartzQuartz是⼀个定时任务框架,其他介绍⽹上也很详尽。

这⾥要介绍⼀下Quartz⾥的⼏个⾮常核⼼的接⼝。

2.1 Scheduler接⼝Scheduler翻译成调度器,Quartz通过调度器来注册、暂停、删除Trigger和JobDetail。

Scheduler还拥有⼀个SchedulerContext,顾名思义就是上下⽂,通过SchedulerContext 我们可以获取到触发器和任务的⼀些信息。

2.2 Trigger接⼝Trigger可以翻译成触发器,通过cron表达式或是SimpleScheduleBuilder等类,指定任务执⾏的周期。

系统时间⾛到触发器指定的时间的时候,触发器就会触发任务的执⾏。

2.3 JobDetail接⼝Job接⼝是真正需要执⾏的任务。

JobDetail接⼝相当于将Job接⼝包装了⼀下,Trigger和Scheduler实际⽤到的都是JobDetail。

3 SpringBoot官⽅⽂档解读SpringBoot官⽅写了spring-boot-starter-quartz。

使⽤过SpringBoot的同学都知道这是⼀个官⽅提供的启动器,有了这个启动器,集成的操作就会被⼤⼤简化。

现在我们来看⼀看SpingBoot2.2.6官⽅⽂档,其中第4.20⼩节Quartz Scheduler就谈到了Quartz,但很可惜⼀共只有两页不到的内容,先来看看这么精华的⽂档⾥能学到些什么。

SpringBoot整合Quartz定时任务的简单实例

SpringBoot整合Quartz定时任务的简单实例

SpringBoot整合Quartz定时任务的简单实例POM.XML⽂件<!-- 定时器任务 quartz需要导⼊的坐标 --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>1.8.5</version></dependency>类似于控制器代码:package com.xiaowu.quartz.demo;import java.util.Date;import org.springframework.scheduling.annotation.Scheduled;import ponent;/***** Quartz设置项⽬全局的定时任务** @Component注解的意义泛指组件,当组件不好归类的时候,我们可以使⽤这个注解进⾏标注。

⼀般公共的⽅法我会⽤上这个注解*** @author WQ**/@Componentpublic class QuartzDemo {@Scheduled(cron = "0 0/1 * * * ?") // 每分钟执⾏⼀次public void work() throws Exception {System.out.println("执⾏调度任务:"+new Date());}@Scheduled(fixedRate = 5000)//每5秒执⾏⼀次public void play() throws Exception {System.out.println("执⾏Quartz定时器任务:"+new Date());}@Scheduled(cron = "0/2 * * * * ?") //每2秒执⾏⼀次public void doSomething() throws Exception {System.out.println("每2秒执⾏⼀个的定时任务:"+new Date());}@Scheduled(cron = "0 0 0/1 * * ? ") // 每⼀⼩时执⾏⼀次public void goWork() throws Exception {System.out.println("每⼀⼩时执⾏⼀次的定时任务:"+new Date());}}启动SpringBoot项⽬,即可。

使用SpringQuartz执行定时任务的表达式

使用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定时任务(schedule、quartz)

SpringBoot定时任务(schedule、quartz)

SpringBoot定时任务(schedule、quartz)Scheduled 只适合处理简单的计划任务,不能处理分布式计划任务。

优势:是spring框架提供的计划任务,开发简单,执⾏效率⽐较⾼。

且在计划任务数量太多的时候,可能出现阻塞,崩溃,延迟启动等问题。

Scheduled定时任务是spring3.0版本之后⾃带的⼀个定时任务。

其所属Spring的资源包为:spring-context-support。

所以需要使⽤Scheduled定时任务机制时,需要在⼯程中依赖对应资源,具体如下:<!-- scheduled所属资源为spring-context-support --><dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId></dependency> 如果在spring应⽤中需要启⽤Scheduled定时任务,则需要在启动类上增加注解@EnableScheduling,代表启⽤Scheduled定时任务机制。

具体如下:@SpringBootApplication@EnableSchedulingpublic class AppStarter { public static void main(String[] args) { SpringApplication.run(AppStarter.class, args); }} Scheduled定时任务的核⼼在于注解@Scheduled,这个注解的核⼼属性是cron,代表定时任务的触发计划表达式。

这个表达式的格式为:@Scheduled(cron="seconds minutes hours day month week") 或@Scheduled(cron="seconds minutes hours day month week year") 推荐使⽤第⼀种表达式形式,因为在很多其他技术中都有不同的定时任务机制,其中⽤于设置触发计划的表达式都是第⼀种cron表达式。

Quartzspring定时任务开发初步

Quartzspring定时任务开发初步

Quartz spring 定时任务开发初步主要参考:、SchedulerFactoryBean会自动启动。

当在spring文件中定义了多个SchedulerFactoryBean实例时,一定要小心,因为这些ScheduleFactoryBean自从load进程序里,就会自动启动。

如果要手动控制,注意要将autoStartup属性设置为false。

2、SchedulerFactoryBean暴露的是Scheduler,而不是SchedulerFactoryBean。

SchedulerFactoryBean实现了FactoryBean接口,必须实现两个方法,一个是getObjectType,另外一个则是getObject;其中getObjectType定义了返回的类型应该为Scheduler,而getObject指定了返回的是其一个重要属性scheduler,这个scheduler就是我们要获得的调度。

若在配置文件里为SchedulerFactoryBean定义了id属性为"scheduler",则在程序里调用getBean时,需要注意getBean("scheduler")返回的是Scheduler对象3、SchedulerFactoryBean中有两个很重要的属性,一个是scheduler,另外一个是schedulerFactoryClass,spring通过用schedulerFactoryClass做代理来产生调度,并把它赋给scheduler。

private Class schedulerFactoryClass=StdSchedulerFactory.class;//如果你没有指定schedulerFactoryClass,那么它用的是quartz中自带的调度工厂,this.scheduler=createScheduler(schedulerFactory,this.schedulerNam e);//这里的schedulerName默认传进来是空的,其实如果你不是用自己定义的schedulerFactoryClass//恐怕也没有什么意义,因为createScheduler是这样调用的return schedulerFactory.getScheduler();//显然schedulerName并没有用到,除非是你自行写一个schedulerFactory,并做好相应处理,//否则返回的这个scheduler一定是一个指定名称的调度Scheduler sched=schedRep.lookup(getSchedulerName());//这个sched就是要代理生成的scheduler,getSchedulerName只有一句话,如下:cfg.getStringProperty(PROP_SCHED_INSTANCE_NAME,"QuartzScheduler");//如果我们没有使用一些特殊的机制,那么返回的只能是一个固定的字符串。

Spring集成Quartz定时任务框架介绍和Cron表达式详解

Spring集成Quartz定时任务框架介绍和Cron表达式详解

在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方法即为调度业务方法。

java中spring与Quartz 整合定时任务

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个)有空格分隔的时间元素。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Spring+Quartz实现定时任务的配置方法
第一步:.导入相关的jar包
(1)spring.jar
(2)quartz-1.6.0.jar
(3)相关包
commons-collections-3.2.jar ; commons-logging-1.1.1.jar; log4j-1.2.16.jar
第二步:创建一个类来定义工作
定义Quartz工作的第一步是创建一个类来定义工作。

要做到这一点,你需要从Spring 的QuartzJobBean中派生子类。

第三步:配置JobDetail
值得注意的是,在这里你并没有直接声明一个TopTenTask Bean,而是声明了一个JobDetailBean。

这是使用Quartz时的一个特点。

JobDetailBean是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。

使用Quartz的JobDetail中的另一个特别之处是TopTenTask的timeout属性是间接设置的。

JobDetail的jobDataAsMap属性接受一个java.util.Map,其中包含了需要设置给jobClass的各种属性。

在这里,这个map包含了一个键值为timeout。

当JobDetailBean实例化时,它会将5注入到EmailReportJob的timeout属性中。

第四步:配置Trigger
工作已经被定义好了,接下来你需要调度这个工作。

Quartz的org.quartz.Trigger类描述了何时及以怎样的频度运行一个Quartz工作。

Spring提供了两个触发器,SimpleTriggerBean和CronTriggerBean。

SimpleTriggerBean与ScheduledTimerTask类似。

你可以用它来指定一个工作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。

例如,要调度报表工作每24小时运行一次,第一次在1小时之后开始运行,可以按照以下方式进行声明:
<bean id="topTenTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="topTenTask"/>
</property>
<property name="startDelay">
<value>3600000</value>
</property>
<property name="repeatInterval">
<value>86400000</value>
</property>
</bean>
属性jobDetail装配了将要被调度的工作,在这个例子中是topTenTask Bean。

属性repeatInterval告诉触发器以怎样的频度运行这个工作(以毫秒作为单位)。

这里,我们
设置它为86400000,因此每隔24小时它会被触发一次。

你也可以选择设置startDelay 属性来延迟工作的第一次执行。

我们设置它为3600000,因此在第一次触发之前它会等待1小时。

CronTriggerBean允许你更精确地控制任务的运行时间。

和SimpleTriggerBean一样,jobDetail属性告诉触发器调度哪个工作。

这里我们又一次装配了一个topTenTask Bean。

属性cronExpression告诉触发器何时触发。

属性cronExpression告诉触发器何时触发。

如果你不熟悉cron,这个属性可能看上去有点神秘,因此让我们进一步考察一下这个属性。

字段允许值允许的特殊字符
秒0-59, - * /
分0-59, - * /
小时0-23, - * /
日0-31, - * ? / L W C
月1-12 或者JAN-DEC , - * /
周几1-7 或者SUN-SAT, - * ? / L C #
年(可选字段)留空, 1970-2099, - * /
(1)
(2)“-”字符:指定一个值的范围
(3)“*”字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义。

(4)“/”字符:指定一个值的增加幅度。

n/m表示从n开始,每次增加m
(5)“?”字符:表示不确定的值
(6)“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
(7)“W”字符:指定离给定日期最近的工作日(周一到周五)
(8)“C”字符可用于“日”和“周几”字段,它是"calendar"的缩写。

它表示为基于相关
的日历所计算出的值(如果有的话)。

如果没有关联的日历, 那它等同于包含全部日历。

“日”字段值为"5C"表示"日历中的第一天或者5号以后",“周几”字段值为"1C"则表示"日历中的第一天或者周日以后"。

(9)“#”字符:表示该月第几个周X。

6#3表示该月第3个周五
cronExpression表达式的示例:
"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触发
第五步:启动工作
属性triggers接受一组触发器。

此处配置了两个触发器,其中一个就是之前配置的topTenTrigger。

相关文档
最新文档