Spring task定时任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring task定时任务相关的知识,希望对你有一定的参考价值。

参考技术A

在Java中有三种实现定时任务的方式:1.java自带的API java.util.Timer类 java.util.TimerTask类 。2. Quartz框架 开源 功能强大 使用起来稍显复杂. 3.Spring 3.0以后自带了 task 调度工具,比Quartz更加的简单方便.

Spring从3.0后自带了task调度工具,不需要引入其他的第三方依赖。在启动类上添加 @EnableScheduling 注解

ScheduleTask.java

在需要定时执行的方法上添加 @Scheduled 注解并指定cron的值,上面的这个例子让打印语句每天凌晨两点执行一次。

这个注解标记了一个将要被定时执行的方法, cron fixedDelay fixedRate 三个属性必选其一。

被注解的方法不能传入参数,通常有一个 void 的返回值,如果不是,返回值将会被忽略。

cron 是一个类似cron的表达式,可以指定秒、分、时、一个月的第几天、月、一周的星期几。例如,"0 * * * * MON-FRI"表示工作日的每一分钟都执行。

zone 指定了cron表达式的时区。如果未指定,则是服务器的默认时区。

fixedDelay :执行注解方法的固定的毫秒数间隔,这个间隔是指上一次调用的结束和下一次调用的开始的时间。

fixedRate :执行注解方法的固定的毫秒数间隔,这个间隔是指每次调用之间的时间。与上面的区别是:fixedDelay是前一个方法执行完毕后的固定时间再执行下一个方法,fixedRate是上一个方法开始执行固定时间后执行下一个方法。

cron表达式可以分为两种:

1、6位长度的  秒 分 时 日 月 星期

2、7位长度的  秒 分 时 日 月 星期 年

一般都是用6位长度的。

秒:  可出现 , - * / 四个字符,有效范围为0-59的整数

分:  可出现 ,- * / 四个字符,有效范围为0-59的整数

时:  可出现 ,- * / 四个字符,有效范围为0-23的整数

日:  可出现 ,- * / ? L W C 八个字符,有效范围为0-31的整数

月:  可出现 ,- * / 四个字符,有效范围为1-12的整数或JAN-DEC

星期:  可出现 ,- * / ? L C # 八个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天

年:  可出现 ,- * / 四个字符,有效范围为1970-2099年

(1)*:表示匹配该域的任意值,假如在Minutes域使用*,即表示每分钟都会触发事件。

(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。
例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?,其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。

(3)-:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次

(4)/:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.

(5),:表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。

(6)L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。

(7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。
例如:在DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日触发;
如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份

(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
(9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

有时候需要执行的定时任务会很多,如果是串行执行会带来一些问题,比如一个很耗时的任务阻塞住了,一些需要短周期循环执行的任务也会卡住,所以可以配置一个线程池来并行执行定时任务。

有两种配置方式,一种是写一个配置类创建一个线程池,另一种是在yml文件中进行配置创建线程池。

配置文件的方式:

Spring Task 定时任务

  所谓定时任务。就是依据我们设定的时间定时运行任务,就像定时发邮件一样,设定时间到了。邮件就会自己主动发送。

  在Spring大行其道的今天,Spring也提供了其定时任务功能,Spring Task。同Spring的其它功能一样,我们既能够通过配置文件也能够通过注解形式来实现。


一、通过配置文件

1、任务运行类

import org.springframework.stereotype.Service;  
@Service  
public class TaskTest{  
      
    public void Test(){  
        System.out.println(new Date() + "定时任务開始…");  
    }  
}

2spring配置文件

<?xml version="1.0" encoding="UTF-8"?

> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" <strong>xmlns:task="http://www.springframework.org/schema/task"</strong> xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd <strong>http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd</strong> http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx">   .   .   .   <context:component-scan base-package=" com.hp.task" />   <task:scheduled-tasks> <task:scheduled ref="taskTest" method="test" cron="0/5 * * * * ?"/>   </task:scheduled-tasks> </beans>


參数说明:ref參数是运行任务类。method是类中须要运行的方法。cron运行表达式表示运行的时间及策略。


二、通过注解

1、任务运行类

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 定时处理类
 * 
 * @author zjj
 * @date 2015-6-30
 */
@Component
public class TaskTest{
	/**
	 * 定时处理方法測试
	 * 每5秒一次
	 */
	@Scheduled(cron = "0/5 * *  * * ?

") public void Test() { System.out.println(new Date() + "定时任务開始…"); } }


这里须要两个注解:

  @Component:将该类完毕bean创建和自己主动依赖注入

  @Scheduled:将该方法定义为Spring定时调用的方法,当中cron指该方法运行的时间及策略


2Spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.1.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx">

  <context:component-scan base-package=" com.hp.task" /> 

  <!—开启这个配置,spring才干识别@Scheduled注解   -->  
  <task:scheduler id="scheduler" pool-size="10" />
  <task:executor id="executor" pool-size="10" />
  <task:annotation-driven scheduler="scheduler" executor="executor" />

</beans>

总结

  两种方式实现定时任务都是非常方便的,可是都存在同一个问题。定时策略在项目启动后我们无法动态改动。要改动就须要重新启动服务,如何做到定时策略动态设定也将是兴许解决的问题。












以上是关于Spring task定时任务的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 中使用 Spring Task 实现定时任务

Spring Boot 中使用 Spring Task 实现定时任务

Spring - spring task 定时任务

定时任务spring task

spring task的定时任务突然断了

Spring Task定时任务的配置和使用详解