[Spring官方教程] - 使用springs构建一个scheduling-tasks应用

本指南将引导你完成用Spring调度任务的步骤。

你将建造什么

你将建立一个应用程序,通过使用Spring的@Scheduled注解,每五秒打印出当前时间。

你需要什么

从 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()
}

手动初始化(可选)

如果你想手动初始化项目,而不是使用前面显示的链接,请按照下面的步骤进行。

  1. 导航到https://start.springboot.io。这个服务拉入你的应用程序所需的所有依赖项,并为你做大部分的设置。
  2. 2.选择Gradle或Maven以及你想使用的语言。本指南假设你选择了Java。
  3. 点击生成
  4. 下载生成的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
...

总结

祝贺你! 你创建了一个带有计划任务的应用程序。另外,这种技术在任何类型的应用程序中都适用。

另外

以下指南可能也有帮助。

想写一份新的指南或对现有的指南做出贡献?请查看我们的贡献指南


原文:Getting Started | Scheduling Tasks