诗与远方

Java-Spring Boot之计划任务

Spring Boot之计划任务

本向导将带您使用Spring Boot 逐步创建计划任务。

目标

创建一个定时任务程序,每隔5秒打印出当前的时间。使用Spring的 @Scheduled 注解来进行实现。

你需要

怎样完成本向导

Like most Spring Getting Started guides, you can start from scratch and complete each step, or you can bypass basic setup steps that are already familiar to you. Either way, you end up with working code.

To start from scratch, move on to Build with Gradle.

To skip the basics, do the following:

  • Download and unzip the source repository for this guide, or clone it using Git: git clone https://github.com/spring-guides/gs-scheduling-tasks.git
  • cd into gs-scheduling-tasks/initial
  • Jump ahead to Create a scheduled task.

When you’re finished, you can check your results against the code in gs-scheduling-tasks/complete.

Build with Gradle

使用Maven来构建项目

首先创建maven的构建脚本. 如果你还对maven不太熟悉的话,请看 Building Java Projects with Maven.

创建目录结构

在项目的目录下面创建如下的目录结构,比如在Linux系统中使用命令mkdir -p src/main/java/hello

1
2
3
4
└── src
└── main
└── java
└── hello

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-scheduling-tasks</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

Spring Boot Maven 插件 提供了许多方便的特性:

  • 包含创建可执行程序(”über-jar”)的所有的jar包,使得执行和部署更加方便。
  • 搜索方法 public static void main() 来作为程序的入口.
  • 提供一个最佳版本的依赖解决方案。当然,你可以重新定义某个依赖的版本,但是Spring Boot会给你默认选择合适的版本。

Build with your IDE

创建一个计划任务

到目前为止,你已经创建好了项目,接下来创建一个计划任务。

src/main/java/hello/ScheduledTasks.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package hello;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
log.info("The time is now {}", dateFormat.format(new Date()));
}
}

The Scheduled annotation defines when a particular method runs.

注意:示例使用了 fixedRate注解,指定了每次开始执行的时间间隔。还有其它一些像fixedDelay可选项,。用来指定从上次任务结束到再次启动的时间间隔,你也可以使用 @Scheduled(cron=". . .") 表达示来进行更加复杂的任务调度。参考.

开启计划任务

虽然计划任务可以嵌入在web应用程序和war文件 ,但是接下来我们将简单演示创建一个独立的应用。通过main() 方法来进行启动。

src/main/java/hello/Application.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class);
}
}

@SpringBootApplication 是一个很便利的注解,提供以下支持:

  • @Configuration 注解表明这是一个包含应用上下文( application context)bean声明的源文件。
  • @EnableAutoConfiguration 注解告诉 Spring Boot在启动时添加基于classpath的设置,其他bean,以及各种适当的设置。
  • 通常你需要添加 @EnableWebMvc注解来表明这是一个Spring MVC 应用, 但是如果发现classpath下面有spring-webmvc的话,springboot会自动添加这个注解。此注解表示这是一个web应用,启动一些相关的操作,比如启动 DispatcherServlet.
  • @ComponentScan 注释告诉 Spring 在 hello 包里面查找其它的 components, configurations, and services , controllers.

main() 方法使用 Spring Boot的 SpringApplication.run() 方法来启动一个应用。

你注意到了吗?没有一行xml配置文件!没有web.xml,其它都没有。100%纯Java代码,再也不需要处理任何架构或者构建相关的配置。

@EnableScheduling 确保后台任务被正确创建。否则,将不会被调度。

创建一个可执行的JAR包

你可以使用Gradle或者Maven在命令行来运行应用,或者你可以将需要的依赖包、类文件和资源打包成一个jar包,然后再运行它。这样使得在整个开发周期内,应用更加容易进行版本控制、发布、部署。

如果你使用 Gradle,你可以使用 ./gradlew bootRun命令来启动应用,或者使用 ./gradlew build命令来打包成jar包,然后再运行 JAR 文件:

1
java -jar build/libs/gs-scheduling-tasks-0.1.0.jar

如果你使用 Maven,你可以使用 ./mvnw spring-boot:run命令来启动应用,或者使用 ./mvnw clean package命令来打包成jar包,然后再运行 JAR 文件:

1
java -jar target/gs-scheduling-tasks-0.1.0.jar

The procedure above will create a runnable JAR. You can also opt to build a classic WAR fileinstead.

如果可以看到打印出来的日志,说明后台线程已经开始工作。你可以看到你的计划任务将每隔5秒执行一次。

1
2
3
4
5
[...]
2016-08-25 13:10:00.143 INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:00
2016-08-25 13:10:05.143 INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:05
2016-08-25 13:10:10.143 INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:10
2016-08-25 13:10:15.143 INFO 31565 --- [pool-1-thread-1] hello.ScheduledTasks : The time is now 13:10:15

总结

恭喜!你创建了一个任务调度的应用程序,虽然代码很短,但这种方式可以应用于任何应用程序中。

英文原文:https://spring.io/guides/gs/scheduling-tasks/#initial