开始

如果您刚刚开始使用 Spring Cloud Task,则应阅读本节。 在这里,我们回答了基本的 “what?”、“how?” 和 “why?” 问题。我们从 Spring Cloud Task 的简要介绍。然后,我们构建一个 Spring Cloud Task 应用程序 边走边讨论一些核心原则。spring-doc.cn

Spring Cloud Task 简介

Spring Cloud Task 使创建短期微服务变得容易。它提供 允许在生产中按需执行短期 JVM 进程的功能 环境。spring-doc.cn

系统要求

您需要安装 Java(Java 17 或更高版本)。spring-doc.cn

数据库要求

Spring Cloud Task 使用关系数据库来存储已执行任务的结果。 虽然您可以在没有数据库的情况下开始开发任务(任务的状态会记录下来 作为任务存储库更新的一部分),对于生产环境,您希望 使用支持的数据库。Spring Cloud Task 目前支持以下数据库:spring-doc.cn

开发您的第一个 Spring Cloud 任务应用程序

一个好的起点是一个简单的 “Hello, World!” 应用程序,因此我们创建 Spring Cloud Task 等效于突出框架的功能。大多数 IDE 都有 对 Apache Maven 的良好支持,因此我们将其用作此项目的构建工具。spring-doc.cn

spring.io 网站包含许多入门” 使用 Spring Boot 的指南。如果您需要解决特定问题,请先检查那里。 您可以通过转到 Spring Initializr 并创建一个新项目来简化以下步骤。这样做 自动生成新的项目结构,以便您可以立即开始编码。 我们建议尝试使用 Spring Initializr 来熟悉它。

使用 Spring Initializr 创建 Spring 任务项目

现在,我们可以创建并测试打印到控制台的应用程序。Hello, World!spring-doc.cn

为此,请执行以下操作:spring-doc.cn

  1. 访问 Spring Initialzr 网站。spring-doc.cn

    1. 创建一个 Group name 为 和 Artifact name 的新 Maven 项目。io.spring.demohelloworldspring-doc.cn

    2. 在 Dependencies (依赖项) 文本框中,键入并选择带有标签的依赖项。taskTaskSpring Cloudspring-doc.cn

    3. 在 Dependencies (依赖项) 文本框中,键入并选择带有标签的依赖项。h2H2SQLspring-doc.cn

    4. 单击 Generate Project 按钮spring-doc.cn

  2. 解压缩 helloworld.zip 文件并将项目导入到您最喜欢的 IDE 中。spring-doc.cn

编写代码

要完成我们的应用程序,我们需要使用以下内容更新生成的应用程序,以便它启动一个 Task。HelloworldApplicationspring-doc.cn

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.task.configuration.EnableTask;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableTask
public class HelloworldApplication {

	@Bean
	public ApplicationRunner applicationRunner() {
		return new HelloWorldApplicationRunner();
	}

	public static void main(String[] args) {
		SpringApplication.run(HelloworldApplication.class, args);
	}

	public static class HelloWorldApplicationRunner implements ApplicationRunner {

		@Override
		public void run(ApplicationArguments args) throws Exception {
			System.out.println("Hello, World!");

		}
	}
}

虽然它可能看起来很小,但正在发生相当多的事情。有关 Spring 的更多信息 引导细节,请参阅 Spring Boot 参考文档spring-doc.cn

现在我们可以在 中打开文件。 我们需要在 中配置两个属性:application.propertiessrc/main/resourcesapplication.propertiesspring-doc.cn

  • application.name:设置应用程序名称(转换为任务名称)spring-doc.cn

  • logging.level:要将 Spring Cloud 任务的日志记录设置为 了解正在发生的事情。DEBUGspring-doc.cn

以下示例显示了如何执行这两项操作:spring-doc.cn

logging.level.org.springframework.cloud.task=DEBUG
spring.application.name=helloWorld

任务自动配置

当包含 Spring Cloud Task Starter 依赖项时,Task auto 会配置所有 bean 以引导其功能。 此配置的一部分注册 和 基础结构以供其使用。TaskRepositoryspring-doc.cn

在我们的演示中,使用嵌入式 H2 数据库来记录结果 的任务。此 H2 嵌入式数据库不是生产环境的实用解决方案,因为 任务结束后,H2 DB 就会消失。但是,为了快速入门 经验,我们可以在示例中使用它,并将正在更新的内容回显到日志中 在那个存储库中。在 Configuration (配置) 部分(稍后部分) 文档),我们将介绍如何自定义 Spring Cloud 任务。TaskRepositoryspring-doc.cn

当我们的示例应用程序运行时,Spring Boot 会启动我们的 “Hello, World!” 消息并输出到 standard out。在存储库中记录任务的开始和结束。HelloWorldApplicationRunnerTaskLifecycleListenerspring-doc.cn

main 方法

main 方法用作任何 Java 应用程序的入口点。我们的主要方法 委托给 Spring Boot 的 SpringApplication 类。spring-doc.cn

ApplicationRunner 的

Spring 包含许多方法来引导应用程序的 logic。Spring Boot 提供 一种通过其接口以有组织的方式执行此操作的便捷方法 ( 或 )。一个表现良好的任务可以引导任何 logic 使用这两个 runner 之一。*RunnerCommandLineRunnerApplicationRunnerspring-doc.cn

任务的生命周期从执行方法之前开始考虑 到它们全部完成之后。Spring Boot 允许应用程序使用多个实现,Spring Cloud Task 也是如此。*Runner#run*Runnerspring-doc.cn

从 或 (通过使用,例如) 以外的机制引导的任何处理都不是 由 Spring Cloud Task 记录。CommandLineRunnerApplicationRunnerInitializingBean#afterPropertiesSet

运行示例

此时,我们的应用程序应该可以正常工作。由于此应用程序基于 Spring Boot,因此 我们可以使用 from the root 从命令行运行它 ,如以下示例中所示(及其输出):$ ./mvnw spring-boot:runspring-doc.cn

$ mvn clean spring-boot:run
....... . . .
....... . . . (Maven log output here)
....... . . .

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.1)

2024-01-04T10:07:01.102-06:00  INFO 18248 --- [helloWorld] [           main] i.s.d.helloworld.HelloworldApplication   : Starting HelloworldApplication using Java 21.0.1 with PID 18248 (/Users/dashaun/fun/dashaun/spring-cloud-task/helloworld/target/classes started by dashaun in /Users/dashaun/fun/dashaun/spring-cloud-task/helloworld)
2024-01-04T10:07:01.103-06:00  INFO 18248 --- [helloWorld] [           main] i.s.d.helloworld.HelloworldApplication   : No active profile set, falling back to 1 default profile: "default"
2024-01-04T10:07:01.526-06:00  INFO 18248 --- [helloWorld] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2024-01-04T10:07:01.626-06:00  INFO 18248 --- [helloWorld] [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:3ad913f8-59ce-4785-bf8e-d6335dff6856 user=SA
2024-01-04T10:07:01.627-06:00  INFO 18248 --- [helloWorld] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2024-01-04T10:07:01.633-06:00 DEBUG 18248 --- [helloWorld] [           main] o.s.c.t.c.SimpleTaskAutoConfiguration    : Using org.springframework.cloud.task.configuration.DefaultTaskConfigurer TaskConfigurer
2024-01-04T10:07:01.633-06:00 DEBUG 18248 --- [helloWorld] [           main] o.s.c.t.c.DefaultTaskConfigurer          : No EntityManager was found, using DataSourceTransactionManager
2024-01-04T10:07:01.639-06:00 DEBUG 18248 --- [helloWorld] [           main] o.s.c.t.r.s.TaskRepositoryInitializer    : Initializing task schema for h2 database
2024-01-04T10:07:01.772-06:00 DEBUG 18248 --- [helloWorld] [           main] o.s.c.t.r.support.SimpleTaskRepository   : Creating: TaskExecution{executionId=0, parentExecutionId=null, exitCode=null, taskName='helloWorld', startTime=2024-01-04T10:07:01.757268, endTime=null, exitMessage='null', externalExecutionId='null', errorMessage='null', arguments=[]}
2024-01-04T10:07:01.785-06:00  INFO 18248 --- [helloWorld] [           main] i.s.d.helloworld.HelloworldApplication   : Started HelloworldApplication in 0.853 seconds (process running for 1.029)
Hello, World!
2024-01-04T10:07:01.794-06:00 DEBUG 18248 --- [helloWorld] [           main] o.s.c.t.r.support.SimpleTaskRepository   : Updating: TaskExecution with executionId=1 with the following {exitCode=0, endTime=2024-01-04T10:07:01.787112, exitMessage='null', errorMessage='null'}
2024-01-04T10:07:01.799-06:00  INFO 18248 --- [helloWorld] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2024-01-04T10:07:01.806-06:00  INFO 18248 --- [helloWorld] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

....... . . .
....... . . . (Maven log output here)
....... . . .

前面的输出有三行我们在这里感兴趣:spring-doc.cn

  • SimpleTaskRepository在 中记录了条目的创建。TaskRepositoryspring-doc.cn

  • 我们的 , 的执行由 “Hello, World!” 输出演示。ApplicationRunnerspring-doc.cn

  • SimpleTaskRepository在 中记录任务的完成情况。TaskRepositoryspring-doc.cn

可以在 Spring Cloud 的 samples 模块中找到一个简单的任务应用程序 任务项目在这里