此版本仍在开发中,尚未被视为稳定版本。最新的稳定版请使用 spring-cloud-task 3.1.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。最新的稳定版请使用 spring-cloud-task 3.1.1Spring中文文档

如果您刚刚开始使用 Spring Cloud Task,则应阅读本节。 在这里,我们回答基本的“什么?”、“如何?”和“为什么?”的问题。我们从 对 Spring Cloud Task 的温和介绍。然后,我们构建一个 Spring Cloud Task 应用程序, 边走边讨论一些核心原则。Spring中文文档

Spring Cloud 任务简介

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

系统要求

您需要安装 Java(Java 17 或更高版本)。Spring中文文档

数据库要求

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

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

一个好的起点是一个简单的“Hello, World!”应用程序,因此我们创建了 Spring Cloud Task 等同于突出框架的功能。大多数 IDE 都具有 对 Apache Maven 有很好的支持,所以我们用它作为这个项目的构建工具。Spring中文文档

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

使用 Spring Initializr 创建 Spring 任务项目

现在,我们可以创建并测试打印到控制台的应用程序。Hello, World!Spring中文文档

为此,请执行以下操作:Spring中文文档

  1. 访问 Spring Initialzr 网站。Spring中文文档

    1. 创建一个新的 Maven 项目,其组名称为 和 项目名称为 。io.spring.demohelloworldSpring中文文档

    2. 在“依赖项”文本框中,键入并选择带有标签的依赖项。taskTaskSpring CloudSpring中文文档

    3. 在“依赖项”文本框中,键入并选择带有标签的依赖项。h2H2SQLSpring中文文档

    4. 单击“生成项目”按钮Spring中文文档

  2. 解压缩 helloworld.zip 文件并将项目导入到您喜欢的 IDE 中。Spring中文文档

编写代码

为了完成我们的应用程序,我们需要使用以下内容更新生成的内容,以便它启动一个 Task。HelloworldApplicationSpring中文文档

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中文文档

现在我们可以在 中打开文件。 我们需要在以下位置配置两个属性:application.propertiessrc/main/resourcesapplication.propertiesSpring中文文档

  • application.name:设置应用程序名称(转换为任务名称)Spring中文文档

  • logging.level:将Spring Cloud Task的日志记录设置为 了解正在发生的事情。DEBUGSpring中文文档

以下示例演示如何同时执行这两项操作:Spring中文文档

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

任务自动配置

当包含 Spring Cloud Task Starter 依赖项时,Task 会自动配置所有 Bean 以引导其功能。 此配置的一部分注册 和 基础结构以供其使用。TaskRepositorySpring中文文档

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

当我们的示例应用程序运行时,Spring Boot 会启动我们的并输出我们的“Hello, World!”消息以达到标准。在存储库中记录任务的开始和结束。HelloWorldApplicationRunnerTaskLifecycleListenerSpring中文文档

主要方法

main 方法用作任何 java 应用程序的入口点。我们的主要方法 委托给 Spring Boot 的 SpringApplication 类。Spring中文文档

The ApplicationRunner

Spring 包含许多引导应用程序逻辑的方法。Spring Boot 提供 一种通过其界面以有组织的方式执行此操作的便捷方法 ( 或 )。一个表现良好的任务可以引导任何 逻辑,使用这两个运行器之一。*RunnerCommandLineRunnerApplicationRunnerSpring中文文档

任务的生命周期是从执行方法之前开始考虑的 一旦它们都完成了。Spring Boot 允许应用程序使用多个实现,Spring Cloud Task 也是如此。*Runner#run*RunnerSpring中文文档

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

运行示例

此时,我们的应用程序应该可以正常工作。由于此应用程序是基于Spring Boot的, 我们可以从命令行运行它,方法是从根目录使用 ,如以下示例所示(及其输出):$ ./mvnw spring-boot:runSpring中文文档

$ 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中文文档

一个简单的任务应用程序可以在 Spring Cloud 的 samples 模块中找到 任务项目在这里
spring.io 网站包含许多入门使用 Spring Boot 的指南。如果您需要解决特定问题,请先检查那里。 您可以通过转到 Spring Initializr 并创建一个新项目来快捷执行以下步骤。这样做 自动生成新的项目结构,以便您可以立即开始编码。 我们建议尝试使用 Spring Initializr 来熟悉它。
任何从 or 以外的机制引导的处理(例如,通过使用 )都不是 由 Spring Cloud Task 录制。CommandLineRunnerApplicationRunnerInitializingBean#afterPropertiesSet
一个简单的任务应用程序可以在 Spring Cloud 的 samples 模块中找到 任务项目在这里