> 版本说明
org.springframework
spring-context
3.2.14.RELEASE
org.springframework.webflow
spring-webflow
2.3.4.RELEASE
ch.qos.logback
logback-classic
1.1.0
> 搭建最简单的Spring定时任务工程
Spring定时任务,给人的第一感觉就是简洁(>_
所需要的JAR,参考以上“版本说明”的POM文件,当然,不嫌麻烦,也可以一个个去下载。
把Spring通过web.xml注册进来
contextConfigLocation
classpath*:spring/spring.xml
Spring Context
org.springframework.web.context.ContextLoaderListener
当然,需要告诉Spring去哪儿扫描组件。对了,也要告诉Spring我们是使用注解方式注册任务的
附logback的配置
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
D:/logs/application.log
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
好了,注册一个简单的任务,它每逢0秒执行,打印一个语句
package com.nicchagil.springtask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyFirstSpringJob {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Scheduled(cron = "0 * * * * ?")
public void run() {
logger.info("MyFirstSpringJob trigger...");
}
}
如无意外,启动项目后,可见日志大致如下
22:42:00.024 [pool-1-thread-1] INFO c.n.springtask.MyFirstSpringJob - MyFirstSpringJob trigger...
22:43:00.002 [pool-1-thread-1] INFO c.n.springtask.MyFirstSpringJob - MyFirstSpringJob trigger...
> 如果你同时执行多个任务,且某些任务耗时较长,要配线程池
如题。比如,你设置了12:00触发A任务、12:05触发B任务,如果A任务需耗时10分钟,并且没设置线程池,那么B任务有可能会被推迟到12:10以后再执行哦。
所以,这些情况,我们需设置线程池
注:具体池的大小,视项目情况而定
将任务改为如下测试
第一个任务
packagecom.nicchagil.springtask;
importjava.util.concurrent.TimeUnit;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.scheduling.annotation.Scheduled;
importorg.springframework.stereotype.Component;
@Component
public classMyFirstSpringJob {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Scheduled(cron = "0 * * * * ?")
public voidrun() {
logger.info("MyFirstSpringJob trigger...");
/*模拟此Job需耗时5秒 */
try{
TimeUnit.SECONDS.sleep(5);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
第二个任务
packagecom.nicchagil.springtask;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.scheduling.annotation.Scheduled;
importorg.springframework.stereotype.Component;
@Component
public classMySecondSpringJob {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Scheduled(cron = "3 * * * * ?")
public voidrun() {
logger.info("MySecondSpringJob trigger...");
}
}
由日志可以看出,第一个任务由一个线程执行;而第二个任务启动时,由于第一个任务还未完成,则由另外一个线程执行
22:49:00.023 [myScheduler-1] INFO c.n.springtask.MyFirstSpringJob - MyFirstSpringJob trigger...
22:49:03.002 [myScheduler-2] INFO c.n.springtask.MySecondSpringJob - MySecondSpringJob trigger...