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

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

本节将更详细地介绍Spring Cloud Task,包括如何使用它,如何 配置它,以及相应的扩展点。Spring中文文档

Spring Cloud 任务的生命周期

在大多数情况下,现代云环境是围绕流程的执行而设计的 预计不会结束。如果它们确实结束,它们通常会重新启动。虽然大多数 平台确实有某种方法可以运行一个进程,该进程在结束时不会重新启动, 该运行的结果通常不会以消耗性方式进行维护。春云 Task 提供了在环境中执行短期进程并记录 结果。这样做允许围绕短期进程的微服务架构,如 以及通过消息集成任务来运行时间更长的服务。Spring中文文档

虽然此功能在云环境中很有用,但在 传统的部署模式也是如此。运行 Spring Boot 应用程序时,使用 调度程序,例如 cron,能够监控 完成后申请。Spring中文文档

Spring Cloud Task 采用的方法,即 Spring Boot 应用程序可以启动和 结束,仍然成功。批处理应用程序是处理 预计会结束(通常是短暂的)可能会有所帮助。Spring中文文档

Spring Cloud Task 记录给定任务的生命周期事件。运行时间最长 大多数 Web 应用程序的典型流程不保存其生命周期事件。这 Spring Cloud Task 的核心任务确实如此。Spring中文文档

生命周期由单个任务执行组成。这是 配置为任务的 Spring Boot 应用程序(即,它具有 Sprint Cloud 任务依赖项)。Spring中文文档

在任务开始时,在运行任何 或实现之前,记录开始的条目 事件已创建。此事件是通过被触发来触发的 通过 Spring 框架。这向系统表示所有 Bean 都已准备好使用,并且 在运行任何 OR 实现之前出现 由 Spring Boot 提供。CommandLineRunnerApplicationRunnerTaskRepositorySmartLifecycle#startCommandLineRunnerApplicationRunnerSpring中文文档

任务的记录仅在成功引导 .如果上下文根本无法引导,则任务的运行不会 记录。ApplicationContext

在完成来自 Spring Boot 的所有调用或失败(由 an 表示)后,任务执行为 在存储库中更新了结果。*Runner#runApplicationContextApplicationFailedEventSpring中文文档

如果应用程序要求在 完成任务(所有方法都已调用,任务 repository 已更新),将属性设置为 true。ApplicationContext*Runner#runspring.cloud.task.closecontextEnabled

The TaskExecution

存储在类中的信息在类中建模,并且 由以下信息组成:TaskRepositoryTaskExecutionSpring中文文档

描述

executionidSpring中文文档

任务运行的唯一 ID。Spring中文文档

exitCodeSpring中文文档

从实现生成的退出代码。如果没有 生成退出代码,但抛出 an,设置 1。否则,它是 假定为 0。ExitCodeExceptionMapperApplicationFailedEventSpring中文文档

taskNameSpring中文文档

任务的名称,由配置的 .TaskNameResolverSpring中文文档

startTimeSpring中文文档

任务的启动时间,如调用所示。SmartLifecycle#startSpring中文文档

endTimeSpring中文文档

任务完成的时间,如 .ApplicationReadyEventSpring中文文档

exitMessageSpring中文文档

退出时可用的任何信息。这可以通过编程方式由 .TaskExecutionListenerSpring中文文档

errorMessageSpring中文文档

如果异常是任务结束的原因(如 所示),则该异常的堆栈跟踪将存储在此处。ApplicationFailedEventSpring中文文档

argumentsSpring中文文档

传递到可执行文件中的字符串命令行参数 引导应用程序。ListSpring中文文档

映射退出代码

当任务完成时,它会尝试向操作系统返回退出代码。如果我们看一看 在我们最初的例子中,我们可以看到我们是 不控制我们应用程序的这一方面。因此,如果抛出异常,JVM 返回一个代码,该代码在调试中可能对您有任何用处,也可能没有任何用处。Spring中文文档

因此,Spring Boot 提供了一个接口,可让您 将未捕获的异常映射到退出代码。这样做可以让你在退出级别进行指示 代码,出了什么问题。此外,通过以这种方式映射退出代码,Spring Cloud Task 记录返回的退出代码。ExitCodeExceptionMapperSpring中文文档

如果任务以 SIG-INT 或 SIG-TERM 终止,则退出代码为零,除非 代码中另有规定。Spring中文文档

当任务运行时,退出代码将作为 null 存储在存储库中。 任务完成后,将根据所述准则存储相应的退出代码 在本节的前面。
任务的记录仅在成功引导 .如果上下文根本无法引导,则任务的运行不会 记录。ApplicationContext
如果应用程序要求在 完成任务(所有方法都已调用,任务 repository 已更新),将属性设置为 true。ApplicationContext*Runner#runspring.cloud.task.closecontextEnabled
描述

executionidSpring中文文档

任务运行的唯一 ID。Spring中文文档

exitCodeSpring中文文档

从实现生成的退出代码。如果没有 生成退出代码,但抛出 an,设置 1。否则,它是 假定为 0。ExitCodeExceptionMapperApplicationFailedEventSpring中文文档

taskNameSpring中文文档

任务的名称,由配置的 .TaskNameResolverSpring中文文档

startTimeSpring中文文档

任务的启动时间,如调用所示。SmartLifecycle#startSpring中文文档

endTimeSpring中文文档

任务完成的时间,如 .ApplicationReadyEventSpring中文文档

exitMessageSpring中文文档

退出时可用的任何信息。这可以通过编程方式由 .TaskExecutionListenerSpring中文文档

errorMessageSpring中文文档

如果异常是任务结束的原因(如 所示),则该异常的堆栈跟踪将存储在此处。ApplicationFailedEventSpring中文文档

argumentsSpring中文文档

传递到可执行文件中的字符串命令行参数 引导应用程序。ListSpring中文文档

当任务运行时,退出代码将作为 null 存储在存储库中。 任务完成后,将根据所述准则存储相应的退出代码 在本节的前面。

配置

Spring Cloud Task 提供了现成的配置,如 and 类中所定义。本部分将介绍 默认值以及如何根据您的需要自定义 Spring Cloud Task。DefaultTaskConfigurerSimpleTaskConfigurationSpring中文文档

数据源

Spring Cloud Task 使用数据源来存储任务执行的结果。由 默认,我们提供了一个 H2 的内存实例来提供一个简单的方法 引导开发。但是,在生产环境中,您可能希望 配置自己的 .DataSourceSpring中文文档

如果您的应用程序仅使用一个,并且同时用作您的业务 schema 和 task repository,您需要做的就是提供任何 ( 最简单的方法是通过Spring Boot的配置约定)。Spring Cloud Task 会自动将其用于存储库。DataSourceDataSourceDataSourceSpring中文文档

如果您的应用程序使用多个 ,则需要配置任务 存储库中具有适当的 .这种自定义可以通过 的实现。DataSourceDataSourceTaskConfigurerSpring中文文档

表前缀

的一个可修改属性是任务表的表前缀。由 默认情况下,它们都以 . 是两个例子。但是,修改此前缀可能有一些原因。如果 架构名称需要附加到表名称之前,或者如果有一组任务 在同一架构中需要表,您必须更改表前缀。你可以这样做 通过将 设置为您需要的前缀,如下所示:TaskRepositoryTASK_TASK_EXECUTIONTASK_EXECUTION_PARAMSspring.cloud.task.tablePrefixSpring中文文档

spring.cloud.task.tablePrefix=yourPrefixSpring中文文档

通过使用 ,用户承担了以下责任 创建同时满足任务表架构条件的任务表,但 根据用户的业务需求进行必要的修改。 在创建自己的任务 DDL 时,您可以利用 Spring Cloud 任务模式 DDL 作为指南,如此处所示。spring.cloud.task.tablePrefixSpring中文文档

启用/禁用表初始化

如果您正在创建任务表,并且不希望 Spring Cloud Task 在任务启动时创建它们,将属性设置为 ,如下所示:spring.cloud.task.initialize-enabledfalseSpring中文文档

spring.cloud.task.initialize-enabled=falseSpring中文文档

它默认为 。trueSpring中文文档

该属性已被弃用。spring.cloud.task.initialize.enable

外部生成的任务 ID

在某些情况下,您可能希望允许任务之间的时间差 请求以及基础结构实际启动它的时间。Spring Cloud Task 允许您 在请求任务时创建一个。然后传递 生成到任务,以便它可以更新 任务的生命周期。TaskExecutionTaskExecutionTaskExecutionSpring中文文档

可以通过在 的实现 引用 对象。TaskExecutioncreateTaskExecutionTaskRepositoryTaskExecutionSpring中文文档

为了将 Task 配置为使用生成的 ,添加 以下属性:TaskExecutionIdSpring中文文档

spring.cloud.task.executionid=yourtaskIdSpring中文文档

外部任务 ID

Spring Cloud Task 允许您为每个 .为了将 Task 配置为使用生成的 ,添加 以下属性:TaskExecutionTaskExecutionIdSpring中文文档

spring.cloud.task.external-execution-id=<externalTaskId>Spring中文文档

父任务 ID

Spring Cloud Task 允许您为每个 .一个例子 这将是一个执行另一个或多个任务的任务,并且您要记录哪个任务 启动了每个子任务。要将任务配置为设置父任务,请在子任务上添加以下属性:TaskExecutionTaskExecutionIdSpring中文文档

spring.cloud.task.parent-execution-id=<parentExecutionTaskId>Spring中文文档

TaskConfigurer(任务配置器)

这是一个策略界面,可让您自定义组件的方式 已配置Spring Cloud Task。默认情况下,我们提供 提供逻辑缺省值:基于 -based 的内存中组件(如果未提供,则对开发很有用)和基于 JDBC 的组件(如果有可用组件,则很有用)。TaskConfigurerDefaultTaskConfigurerMapDataSourceDataSourceSpring中文文档

允许您配置三个主要组件:TaskConfigurerSpring中文文档

元件 描述 默认值(由DefaultTaskConfigurer)

TaskRepositorySpring中文文档

要使用的实现。TaskRepositorySpring中文文档

SimpleTaskRepositorySpring中文文档

TaskExplorerSpring中文文档

实现 (用于对任务进行只读访问的组件 repository) 来使用。TaskExplorerSpring中文文档

SimpleTaskExplorerSpring中文文档

PlatformTransactionManagerSpring中文文档

运行任务更新时要使用的事务管理器。Spring中文文档

JdbcTransactionManager如果使用 a。 如果不是。DataSourceResourcelessTransactionManagerSpring中文文档

您可以通过创建 接口的自定义实现。通常,扩展 (如果未找到 a,则提供)和 覆盖所需的 getter 就足够了。但是,从头开始实现自己的 可能需要。TaskConfigurerDefaultTaskConfigurerTaskConfigurerSpring中文文档

用户不应直接从 除非他们使用它来提供要作为 Spring Bean 公开的实现。TaskConfigurer

任务执行侦听器

TaskExecutionListener允许您为在以下期间发生的特定事件注册侦听器 任务生命周期。为此,请创建一个实现接口的类。实现接口的类将收到以下事件的通知:TaskExecutionListenerTaskExecutionListenerSpring中文文档

  • onTaskStartup:在存储到 .TaskExecutionTaskRepositorySpring中文文档

  • onTaskEnd:在更新 和 中的条目之前 标记任务的最终状态。TaskExecutionTaskRepositorySpring中文文档

  • onTaskFailed:在未处理的方法被调用之前 任务引发异常。onTaskEndSpring中文文档

Spring Cloud Task 还允许您将侦听器添加到 Bean 中的方法 通过使用以下方法注释:TaskExecutionSpring中文文档

  • @BeforeTask:在存储之前TaskExecutionTaskRepositorySpring中文文档

  • @AfterTask:在更新条目之前,标记任务的最终状态。TaskExecutionTaskRepositorySpring中文文档

  • @FailedTask:在未处理的方法被调用之前 任务引发异常。@AfterTaskSpring中文文档

以下示例显示了正在使用的三个批注:Spring中文文档

 public class MyBean {

	@BeforeTask
	public void methodA(TaskExecution taskExecution) {
	}

	@AfterTask
	public void methodB(TaskExecution taskExecution) {
	}

	@FailedTask
	public void methodC(TaskExecution taskExecution, Throwable throwable) {
	}
}
在链中插入比存在更早的可能会产生意外效果。ApplicationListenerTaskLifecycleListener

任务执行侦听器引发的异常

如果事件处理程序引发异常,则所有侦听器 该事件处理程序的处理停止。例如,如果三个侦听器 已启动,第一个事件处理程序抛出异常,另一个事件处理程序引发异常 未调用两个方法。但是,将调用 的其他事件处理程序 ( 和 )。TaskExecutionListeneronTaskStartuponTaskStartuponTaskStartuponTaskEndonTaskFailedTaskExecutionListenersSpring中文文档

事件处理程序引发异常时返回的退出代码是 ExitCodeEvent 报告的退出代码。 如果发出 no,则评估引发的异常以查看 如果它的类型为 ExitCodeGenerator。 如果是这样,它将返回 .否则,将返回。TaskExecutionListenerExitCodeEventExitCodeGenerator1Spring中文文档

如果在方法中引发异常,则应用程序的退出代码将为 。 如果在 or 方法中引发异常,则应用程序的退出代码将是使用上面枚举的规则建立的退出代码。onTaskStartup1onTaskEndonTaskFailedSpring中文文档

如果在 、 中抛出异常,或者您不能使用 覆盖应用程序的退出代码。onTaskStartuponTaskEndonTaskFailedExitCodeExceptionMapper

退出消息

您可以使用 以编程方式设置任务的退出消息。这是通过设置 , 然后传递到 .以下示例显示 用以下方法注释的方法:TaskExecutionListenerTaskExecution’sexitMessageTaskExecutionListener@AfterTaskExecutionListenerSpring中文文档

@AfterTask
public void afterMe(TaskExecution taskExecution) {
    taskExecution.setExitMessage("AFTER EXIT MESSAGE");
}

可以在任何侦听器事件(、 和 )中设置 An 。三个侦听器的优先顺序如下:ExitMessageonTaskStartuponTaskFailedonTaskEndSpring中文文档

  1. onTaskEndSpring中文文档

  2. onTaskFailedSpring中文文档

  3. onTaskStartupSpring中文文档

例如,如果为 和 listeners 设置了 an,并且任务结束且没有失败,则 from 将存储在存储库中。否则,如果发生故障,则 已存储。此外,如果您设置了 with 侦听器,则 from 将取代 来自 和 的退出消息。exitMessageonTaskStartuponTaskFailedexitMessageonTaskStartupexitMessageonTaskFailedexitMessageonTaskEndexitMessageonTaskEndonTaskStartuponTaskFailedSpring中文文档

限制 Spring Cloud 任务实例

Spring Cloud Task 允许您确定只能运行一个具有给定任务名称的任务 一次。为此,您需要为每个任务执行建立任务名称和设置。虽然第一个 任务执行正在运行,任何其他尝试运行具有相同任务名称的任务时,并且 任务失败,并显示以下错误消息:默认值为 。这 以下示例演示如何设置为:spring.cloud.task.single-instance-enabled=truespring.cloud.task.single-instance-enabled=trueTask with name "application" is already running.spring.cloud.task.single-instance-enabledfalsespring.cloud.task.single-instance-enabledtrueSpring中文文档

spring.cloud.task.single-instance-enabled=true or falseSpring中文文档

要使用此功能,您必须将以下 Spring Integration 依赖项添加到您的 应用:Spring中文文档

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-core</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-jdbc</artifactId>
</dependency>
如果任务失败,则应用程序的退出代码将为 1,因为此功能 已启用,并且另一个任务正在以相同的任务名称运行。

Spring AOT 和本机编译的单实例用法

要在创建本机编译的应用程序时使用 Spring Cloud Task 的单实例功能,您需要在构建时启用该功能。 为此,请添加 process-aot 执行并设置为 JVM 参数,如下所示:spring.cloud.task.single-step-instance-enabled=trueSpring中文文档

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>process-aot</id>
            <goals>
                <goal>process-aot</goal>
            </goals>
            <configuration>
                <jvmArguments>
                    -Dspring.cloud.task.single-instance-enabled=true
                </jvmArguments>
            </configuration>
        </execution>
    </executions>
</plugin>

启用 ApplicationRunner 和 CommandLineRunner 的观察

启用任务观测值或设置为 true。ApplicationRunnerCommandLineRunnerspring.cloud.task.observation.enabledSpring中文文档

可以在此处找到具有观察结果的示例任务应用程序,该应用程序允许使用 。SimpleMeterRegistrySpring中文文档

禁用 Spring Cloud 任务自动配置

如果不应为实现自动配置 Spring Cloud Task,则可以禁用 Task 的自动配置。 这可以通过向 Task 应用程序添加以下注释来完成:Spring中文文档

@EnableAutoConfiguration(exclude={SimpleTaskAutoConfiguration.class})

您也可以通过将属性设置为 来禁用任务自动配置。spring.cloud.task.autoconfiguration.enabledfalseSpring中文文档

关闭上下文

如果应用程序要求在 完成任务(所有方法都已调用,任务 存储库已更新),将属性设置为 。ApplicationContext*Runner#runspring.cloud.task.closecontextEnabledtrueSpring中文文档

关闭上下文的另一种情况是,当任务执行完成时,应用程序不会终止。 在这些情况下,上下文保持打开状态,因为已分配线程 (例如:如果您使用的是 TaskExecutor)。在这些情况下 将该属性设置为在启动任务时。 任务完成后,这将关闭应用程序的上下文。 从而允许应用程序终止。spring.cloud.task.closecontextEnabledtrueSpring中文文档

启用任务指标

Spring Cloud Task 与 Micrometer 集成,并为其执行的任务创建观察值。 若要启用任务可观测性集成,必须将首选的注册表实现(如果要发布指标)和千分尺跟踪(如果要发布跟踪数据)添加到任务应用程序。 使用 Influx 启用任务可观测性和指标的 maven 依赖项示例集如下:spring-boot-starter-actuatorSpring中文文档

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-influx</artifactId>
    <scope>runtime</scope>
</dependency>

Spring Task 和 Spring Cloud 任务属性

该术语是业内常用的词。在一个这样的例子中,Spring Boot 提供了 而 Spring Cloud Task 提供了属性。 这在过去引起了一些混淆,认为这两组属性是直接相关的。但是,它们代表了 Spring 生态系统中提供的 2 个不同的功能集。taskspring.taskspring.cloud.taskSpring中文文档

该属性已被弃用。spring.cloud.task.initialize.enable
元件 描述 默认值(由DefaultTaskConfigurer)

TaskRepositorySpring中文文档

要使用的实现。TaskRepositorySpring中文文档

SimpleTaskRepositorySpring中文文档

TaskExplorerSpring中文文档

实现 (用于对任务进行只读访问的组件 repository) 来使用。TaskExplorerSpring中文文档

SimpleTaskExplorerSpring中文文档

PlatformTransactionManagerSpring中文文档

运行任务更新时要使用的事务管理器。Spring中文文档

JdbcTransactionManager如果使用 a。 如果不是。DataSourceResourcelessTransactionManagerSpring中文文档

用户不应直接从 除非他们使用它来提供要作为 Spring Bean 公开的实现。TaskConfigurer
在链中插入比存在更早的可能会产生意外效果。ApplicationListenerTaskLifecycleListener
如果在 、 中抛出异常,或者您不能使用 覆盖应用程序的退出代码。onTaskStartuponTaskEndonTaskFailedExitCodeExceptionMapper
如果任务失败,则应用程序的退出代码将为 1,因为此功能 已启用,并且另一个任务正在以相同的任务名称运行。