参考文章:
https://blog.youkuaiyun.com/u011116672/article/details/52517247
https://blog.youkuaiyun.com/lucky_ly/article/details/78726307
Spring Task的作用是处理定时任务。Spring中为定时任务提供TaskExecutor,TaskScheduler两个接口。
TaskExecutor继承了jdk的Executor:
public interface TaskExecutor extends Executor {
void execute(Runnable var1);
}
这意味着他就是一个execute。
TaskScheduler提供定时器支持,即定时滴执行任务:
scheduler.schedule(task, new CronTrigger("30 * * * * ?"));
通过上面的方法,传入一个Rannable任务,Trigger触发器,就可以定时滴执行任务了,具体应用了cron表达式。
在spring 4.x中已经不支持7个参数的cronin表达式了,要求必须是6个参数(具体哪个参数后面会说)。cron表达式的格式如下:
{秒} {分} {时} {日期(具体哪天)} {月} {星期}
1
秒:必填项,允许的值范围是0-59,支持的特殊符号包括
, - * /,,表示特定的某一秒才会触发任务,-表示一段时间内会触发任务,*表示每一秒都会触发,/表示从哪一个时刻开始,每隔多长时间触发一次任务。
分:必填项,允许的值范围是0-59,支持的特殊符号和秒一样,含义类推
时:必填项,允许的值范围是0-23,支持的特殊符号和秒一样,含义类推
日期:必填项,允许的值范围是1-31,支持的特殊符号相比秒多了?,表示与{星期}互斥,即意味着若明确指定{星期}触发,则表示{日期}无意义,以免引起冲突和混乱。
月:必填项,允许的值范围是1-12(JAN-DEC),支持的特殊符号与秒一样,含义类推
星期:必填项,允许值范围是1~7 (SUN-SAT),1代表星期天(一星期的第一天),以此类推,7代表星期六,支持的符号相比秒多了?,表达的含义是与{日期}互斥,即意味着若明确指定{日期}触发,则表示{星期}无意义。
通常而言,可以使用xml配合注解开发,以及注解开发两种。
具体做法为:
1.引入pom文件
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
2.添加定时执行的任务
<context:component-scan base-package="com.springTask"/>
<task:scheduled-tasks>
<task:scheduled ref="taskTest" method="execute" cron="0/1 * * * * ?"/>
</task:scheduled-tasks>
第二种方式,主要基于注解
package com.springTask;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.config.TaskExecutorFactoryBean;
import org.springframework.stereotype.Component;
@Component
public class TaskTest {
@Scheduled(cron="* * * * * ?")
public void execute(){
System.out.println("let's go on " + new SimpleDateFormat().format(new Date()).toString());
}
}
xml配置文件:
<task:annotation-driven/>
<context:component-scan base-package="com.zx.jeeTomatoSyS.*"/>
<task:scheduler id="scheduler" pool-size="100"/>
第三种方式,基于注解:
任务类上 @EnableScheduling 即可。
xml配置文件:
<task:annotation-driven/>
<context:component-scan base-package="com.zx.jeeTomatoSyS.*"/>