本指南将引导你完成用Spring调度任务的步骤。
你将建造什么
你将建立一个应用程序,通过使用Spring的@Scheduled
注解,每五秒打印出当前时间。
你需要什么
- 大约15分钟
- 一个喜欢的文本编辑器或IDE
- JDK 1.8或更高版本
- Gradle 4+ 或 Maven 3.2+
- 你也可以直接将代码导入你的IDE中。
从 Spring Initializr 开始
如果你使用Maven,请访问Spring Initializr 以生成一个具有必要设置的新项目。
下面的列表显示了选择Maven时创建的pom.xml
文件。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>scheduling-tasks</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>scheduling-tasks</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
如果你使用Gradle,请访问Spring Initializr 来生成一个有必要设置的新项目。
下面的列表显示了当你选择Gradle时创建的build.gradle
文件。
plugins {
id 'org.springframework.boot' version '2.4.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
test {
useJUnitPlatform()
}
手动初始化(可选)
如果你想手动初始化项目,而不是使用前面显示的链接,请按照下面的步骤进行。
- 导航到https://start.springboot.io。这个服务拉入你的应用程序所需的所有依赖项,并为你做大部分的设置。
- 2.选择Gradle或Maven以及你想使用的语言。本指南假设你选择了Java。
- 点击生成。
- 下载生成的ZIP文件,这是一个按你的选择配置的Web应用程序的存档。
如果你的IDE有Spring Initializr集成,你可以从你的IDE完成这个过程。
添加 "awaitility "依赖项
complete/src/test/java/com/example/schedulingtasks/ScheduledTasksTest.java
中的测试需要awaitility
库。
awaitility
库的后期版本对这个测试不起作用,所以你必须指定3.1.2版本。
要在Maven中添加awaitility
库,请添加以下依赖。
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>3.1.2</version>
<scope>test</scope>
</dependency>
下面的列表显示了完成的pom.xml
文件。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>scheduling-tasks</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>scheduling-tasks</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>3.1.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
要在Gradle中添加awaitility
库,请添加以下依赖关系。
testImplementation 'org.awaitility:awaitility:3.1.2'
下面的列表显示了完成的build.gradle
文件。
plugins {
id 'org.springframework.boot' version '2.4.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.awaitility:awaitility:3.1.2'
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
test {
useJUnitPlatform()
}
创建一个预定的任务
现在你已经设置了你的项目,你可以创建一个计划任务。下面的列表(来自src/main/java/com/example/schedulingtasks/ScheduledTasks.java
)显示了如何这样做。
/*
* Copyright 2012-2015 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.schedulingtasks;
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()));
}
}
Scheduled
注解定义了一个特定方法的运行时间。
这个例子使用了fixedRate
,它指定了方法调用的时间间隔,从每次调用的开始时间开始计算。还有其他选项,如fixedDelay
,它指定了从任务完成时开始测量的调用间隔。你也可以使用@Scheduled(cron=". . .")
表达式进行更复杂的任务调度。
Enable Scheduling
虽然计划任务可以嵌入到Web应用程序和WAR文件中,但更简单的方法(在下一个列表中显示)创建一个独立的应用程序。要做到这一点,把所有东西都打包在一个可执行的JAR文件中,由一个好的老式Javamain()
方法驱动。下面的列表(来自src/main/java/com/example/schedulingtasks/SchedulingTasksApplication.java
)显示了应用程序类。
package com.example.schedulingtasks;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class SchedulingTasksApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulingTasksApplication.class);
}
}
@SpringBootApplication
是一个方便的注解,添加了以下所有内容。
-
@Configuration
: 将该类标记为应用程序上下文的Bean定义的来源。 -
@EnableAutoConfiguration
: 告诉Spring Boot开始根据classpath设置、其他Bean和各种属性设置来添加Bean。例如,如果spring-webmvc
在classpath上,这个注解将应用程序标记为Web应用程序,并激活关键行为,如设置DispatcherServlet
。 -
@ComponentScan
: 告诉Spring在com/example
包中寻找其他组件、配置和服务,让它找到控制器。
main()
方法使用Spring Boot的SpringApplication.run()
方法来启动一个应用程序。你是否注意到,没有一行XML?也没有web.xml
文件。这个网络应用是100%的纯Java,你不需要处理配置任何管道或基础设施。
@EnableScheduling
注解确保了一个后台任务执行器的创建。没有它,任何东西都不会被调度。
构建一个可执行的JAR
你可以用Gradle或Maven从命令行中运行该应用程序。你也可以构建一个包含所有必要的依赖关系、类和资源的可执行JAR文件并运行它。构建一个可执行的JAR文件可以让你在整个开发生命周期中,在不同的环境中,轻松地将服务作为一个应用来运输、版本和部署,等等。
如果你使用Gradle,你可以通过使用./gradlew bootRun
来运行该应用程序。或者,你可以通过使用./gradlew build
来构建JAR文件,然后运行JAR文件,如下所示。
java -jar build/libs/gs-scheduling-tasks-0.1.0.jar
如果您使用Maven,您可以使用./mvnw spring-boot:run
来运行该应用程序。或者,你可以用./mvnw clean package
构建JAR文件,然后运行JAR文件,如下所示。
java -jar target/gs-scheduling-tasks-0.1.0.jar
这里描述的步骤创建了一个可运行的JAR。你也可以建立一个经典的WAR文件
显示了日志输出,你可以从日志中看到它是在一个后台线程上。你应该看到你的计划任务每五秒发射一次。下面的列表显示了典型的输出。
...
2019-10-02 12:07:35.659 INFO 28617 --- [ scheduling-1] c.e.schedulingtasks.ScheduledTasks : The time is now 12:07:35
2019-10-02 12:07:40.659 INFO 28617 --- [ scheduling-1] c.e.schedulingtasks.ScheduledTasks : The time is now 12:07:40
2019-10-02 12:07:45.659 INFO 28617 --- [ scheduling-1] c.e.schedulingtasks.ScheduledTasks : The time is now 12:07:45
2019-10-02 12:07:50.657 INFO 28617 --- [ scheduling-1] c.e.schedulingtasks.ScheduledTasks : The time is now 12:07:50
...
总结
祝贺你! 你创建了一个带有计划任务的应用程序。另外,这种技术在任何类型的应用程序中都适用。
另外
以下指南可能也有帮助。
想写一份新的指南或对现有的指南做出贡献?请查看我们的贡献指南。