使用Spring调度任务

本指南将带你逐步学习如何使用Spring调度任务。

你将构建什么

你将使用Spring Framework的@Scheduled注解,构建一个每5秒输出当前时间的应用。

你需要什么

  • 约15分钟。
  • 你喜欢的文本编辑器或IDE。
  • Java 17或更高版本。

如何完成本指南

和大多数Spring入门指南一样,你可以从零开始完成每个步骤,也可以查看示例仓库,直接跳到完整解决方案。

要在本地环境查看最终结果,可以选择以下方式:

  • 下载本指南的源码仓库并解压。
  • 用Git克隆仓库:git clone https://github.com/spring-guides/gs-scheduling-tasks.git
  • Fork仓库;这样也可以通过提交pull request建议修改本指南。

从Spring Initializr开始

可以使用预初始化项目,点击Generate下载ZIP文件。该项目已配置为适用于本指南的示例。

手动初始化项目时:

  1. 访问https://start.spring.io。这个服务会引入应用所需的依赖,并完成大部分初始化设置。
  2. 选择Gradle或Maven,以及要使用的语言。本指南假定你选择Java和Gradle。
  3. 点击Generate。
  4. 下载生成的ZIP文件,其中包含按你的选择配置好的应用。

启用任务调度

虽然调度任务可以嵌入Web应用,但本指南采用更简单的独立应用。将所有内容打包成单个可执行JAR文件,由Java的main()方法启动。以下片段来自src/main/java/com/example/schedulingtasks/SchedulingTasksApplication.java,展示应用类:

@SpringBootApplication
@EnableScheduling
public class SchedulingTasksApplication {

Spring Initializr会在主类上添加@SpringBootApplication。它是一个便利注解,相当于加入以下注解:

  • @Configuration:将该类标记为应用上下文中bean定义的来源。
  • @EnableAutoConfiguration:Spring Boot根据已添加的依赖,尝试自动配置Spring应用。
  • @ComponentScan:让Spring查找其他组件、配置和服务。如果没有指定包,则从声明此注解的类所在包开始递归扫描。

此外,添加@EnableScheduling注解,启用Spring的定时任务执行能力。

创建调度任务

创建新类src/main/java/com/example/schedulingtasks/ScheduledTasks.java,内容如下:

@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注解定义特定方法何时运行。

运行应用

现在应能通过执行SchedulingTasksApplication中的主方法运行应用。可以从IDE运行,也可以在项目根目录执行以下Gradle命令:

./gradlew bootRun

这会启动应用,并执行带有@Scheduled注解的方法。日志应类似:

20yy-mm-ddT07:23:01.665-04:00  INFO 19633 --- [   scheduling-1] c.e.schedulingtasks.ScheduledTasks       : The time is now 07:23:01
20yy-mm-ddT07:23:06.663-04:00  INFO 19633 --- [   scheduling-1] c.e.schedulingtasks.ScheduledTasks       : The time is now 07:23:06
20yy-mm-ddT07:23:11.663-04:00  INFO 19633 --- [   scheduling-1] c.e.schedulingtasks.ScheduledTasks       : The time is now 07:23:11

使用awaitility依赖测试

为正确测试应用,可以使用awaitility库。从Spring Boot 3.2开始,Boot会管理这个依赖。可以创建新测试,或查看src/test/java/com/example/schedulingtasks/ScheduledTasksTest.java中的现有测试:

@SpringBootTest
public class ScheduledTasksTest {

	@SpyBean
	ScheduledTasks tasks;

	@Test
	public void reportCurrentTime() {
		await().atMost(Durations.TEN_SECONDS).untilAsserted(() -> {
			verify(tasks, atLeast(2)).reportCurrentTime();
		});
	}
}

运行./gradlew clean build任务时,这个测试会自动执行。

构建应用

本节介绍运行本指南应用的不同方式:

  1. 构建并执行JAR文件。
  2. 使用Cloud Native Buildpacks构建并执行Docker容器。
  3. 构建并执行原生镜像。
  4. 使用Cloud Native Buildpacks构建并执行原生镜像容器。

无论采用哪种方式运行应用,输出都应相同。

可以将应用打包为可执行JAR。./gradlew clean build会编译应用,生成可执行JAR,然后运行java -jar build/libs/gs-scheduling-tasks-0.0.1-SNAPSHOT.jar。

如果有可用Docker环境,也可以直接通过Maven或Gradle插件,使用buildpacks创建Docker镜像。Cloud Native Buildpacks可以生成可在各处运行的Docker兼容镜像。Spring Boot直接为Maven和Gradle提供buildpack支持,因此只需一个命令,即可快速将合理配置的镜像送入本地运行的Docker daemon。

使用Cloud Native Buildpacks创建Docker镜像时,运行./gradlew bootBuildImage。启用Docker环境后,可以通过docker run docker.io/library/gs-scheduling-tasks:0.0.1-SNAPSHOT运行应用。

原生镜像支持

如果机器上安装了GraalVM发行版,Spring Boot也支持编译为原生镜像。使用Native Build Tools,通过Gradle创建原生镜像时,首先确保Gradle构建的plugins块包含org.graalvm.buildtools.native。

plugins {
	id 'org.graalvm.buildtools.native' version '<version>'
...

然后运行./gradlew nativeCompile生成原生镜像。构建完成后,执行build/native/nativeCompile/gs-scheduling-tasks,便可获得接近即时的启动速度。

还可以使用Buildpacks创建原生镜像。运行./gradlew bootBuildImage生成镜像;完成后,运行docker run docker.io/library/gs-scheduling-tasks:0.0.1-SNAPSHOT启动应用。

总结

你已经创建了一个包含调度任务的应用。

另请参阅

以下指南也可能有帮助:

希望编写新指南或参与改进现有指南?请查看贡献指南。


原文:Scheduling Tasks,Spring官方入门指南。原文声明:代码按ASLv2(Apache License 2.0)发布,文字按Creative Commons Attribution-NoDerivatives 3.0发布。本中文版本依据用户所声明的另行转载授权制作,未将CC BY-ND本身解释为允许翻译。保留原示例片段、版本前提与省略号;未执行构建或测试。© 2005–2026 Broadcom。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容