本指南将带你逐步学习如何使用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文件。该项目已配置为适用于本指南的示例。
手动初始化项目时:
- 访问https://start.spring.io。这个服务会引入应用所需的依赖,并完成大部分初始化设置。
- 选择Gradle或Maven,以及要使用的语言。本指南假定你选择Java和Gradle。
- 点击Generate。
- 下载生成的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任务时,这个测试会自动执行。
构建应用
本节介绍运行本指南应用的不同方式:
- 构建并执行JAR文件。
- 使用Cloud Native Buildpacks构建并执行Docker容器。
- 构建并执行原生镜像。
- 使用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。











暂无评论内容