该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 spring-cloud-task 5.0.0spring-doc.cadn.net.cn

特征

本节将更详细介绍春云任务,包括如何使用和作方法 配置它,以及相应的扩展点。spring-doc.cadn.net.cn

春季云任务的生命周期

在大多数情况下,现代云环境是围绕流程执行设计的 这些都不被期望结束。如果比赛结束,通常会重新开始。虽然大多数 平台确实有某种方式可以运行一个进程,结束时不会重启,比如 该运行的结果通常不会以可消耗的方式保存。春云 任务提供了在环境中执行短寿命进程并记录 结果。这样做可以围绕短寿命进程建立微服务架构,如 以及通过消息整合任务实现更长时间的服务。spring-doc.cadn.net.cn

虽然此功能在云环境中很有用,但在 传统部署模式也是如此。当运行带有 调度器如Cron,能够监控结果是有用的 申请完成后。spring-doc.cadn.net.cn

Spring Cloud Task 采用了 Spring Boot 应用程序可以有 start 和 的方法。 一个终结,但仍然成功。批处理应用就是处理这些问题的一个例子 预计会结束(而且通常持续时间很短)是有帮助的。spring-doc.cadn.net.cn

Spring Cloud 任务记录给定任务的生命周期事件。最长寿作品 进程,大多数Web应用程序的典型特征是,不会保存其生命周期事件。这 春云任务的核心任务。spring-doc.cadn.net.cn

生命周期仅包含一次任务执行。这是对 Spring Boot 应用程序配置为任务(即具有 Sprint Cloud 任务依赖)。spring-doc.cadn.net.cn

在任务开始时,在任何事情之前命令线跑者应用运行者已经运行过实现,在任务仓库那是记录起始的 事件被创造出来。该事件通过以下方式触发SmartLifecycle#start被触发 由Spring Framework出版。这向系统表明所有豆子都已准备好使用, 在运行任何命令线跑者应用运行者实现 由Spring Boot提供。spring-doc.cadn.net.cn

任务的记录只有在成功启动应用上下文.如果上下文完全无法引导,任务运行就不算 记录。

完成所有*跑者#跑Spring Boot 的呼叫或应用上下文(表示为ApplicationFailedEvent),任务执行为 已在仓库中更新了结果。spring-doc.cadn.net.cn

如果申请要求应用上下文在 完成一项任务(所有*跑者#跑方法已被调用,任务 仓库已更新),设置了属性spring.cloud.task.closecontextEnabled真是太真实了。

任务执行

存储在任务仓库任务执行类和 包含以下信息:spring-doc.cadn.net.cn

描述

执行元spring-doc.cadn.net.cn

任务运行的唯一ID。spring-doc.cadn.net.cn

exitCodespring-doc.cadn.net.cn

退出代码由ExitCodeExceptionMapper实现。如果没有 退出代码生成,但ApplicationFailedEvent掷出,1被设定。否则,就是 假设为0。spring-doc.cadn.net.cn

taskNamespring-doc.cadn.net.cn

任务名称,由配置决定任务命名解析器.spring-doc.cadn.net.cn

开始时间spring-doc.cadn.net.cn

任务开始的时间,由SmartLifecycle#start叫。spring-doc.cadn.net.cn

终结时间spring-doc.cadn.net.cn

任务完成的时间,由ApplicationReadyEvent.spring-doc.cadn.net.cn

退出消息spring-doc.cadn.net.cn

退出时可用的任何信息。这可以通过程序化设置任务执行监听器.spring-doc.cadn.net.cn

错误消息spring-doc.cadn.net.cn

如果异常是任务结束的原因(如ApplicationFailedEvent),该异常的栈跟踪存储在这里。spring-doc.cadn.net.cn

参数spring-doc.cadn.net.cn

一个列表字符串命令行参数传递到可执行文件中 启动应用。spring-doc.cadn.net.cn

出口代码映射

任务完成后,会尝试返回作系统的退出代码。如果我们看看 在我们最初的例子中,我们可以看到 不控制我们应用中的这一方面。所以,如果抛出异常,JVM 返回的代码可能对你调试有用,也可能没用。spring-doc.cadn.net.cn

因此,Spring Boot 提供了以下接口,ExitCodeExceptionMapper,这让你 地图未捕获的出口代码例外。这样做可以在出口层面打方向灯 代码,哪里出了问题。此外,通过这种方式映射出口代码,春云任务 记录返回的出口代码。spring-doc.cadn.net.cn

如果任务以 SIG-INT 或 SIG-TERM 结束,则退出码为零,除非 代码中另有说明。spring-doc.cadn.net.cn

任务运行时,退出代码会作为空代码存储在仓库中。 任务完成后,根据所述指南存储相应的退出代码 本节前述。

配置

Spring Cloud Task 提供即用配置,定义如下DefaultTaskConfigurerSimpleTaskConfiguration类。本段穿行 默认设置以及如何根据你的需求定制 Spring Cloud 任务。spring-doc.cadn.net.cn

数据来源

Spring Cloud Task 使用数据源存储任务执行结果。由 默认情况下,我们提供 H2 的内存实例,以提供一个简单的方法 自助开发。不过,在生产环境中,你可能会想 你自己配置数据来源.spring-doc.cadn.net.cn

如果你的应用只用一个数据来源这既是你的生意 模式和任务仓库,你只需要提供任何数据来源( 最简单的方法是通过 Spring Boot 的配置规范实现)。这数据来源被 Spring Cloud Task 自动用于仓库。spring-doc.cadn.net.cn

如果你的应用使用多个数据来源,你需要配置任务 带有相应数据来源.这种定制可以通过 实现TaskConfigurer.spring-doc.cadn.net.cn

表前缀

一个可变性质任务仓库是任务表的表前缀。由 默认情况下,它们都以以下形式开头任务_.TASK_EXECUTIONTASK_EXECUTION_PARAMS是两个例子。不过,修改这个前缀是有原因的。如果 模式名称需要在表名前加上,或者如果有多个任务集 需要在同一模式内的表,你必须更改表前缀。你可以这么做 通过设置spring.cloud.task.tablePrefix到你需要的前缀,具体如下:spring-doc.cadn.net.cn

spring.cloud.task.tablePrefix=yourPrefixspring-doc.cadn.net.cn

通过使用spring.cloud.task.tablePrefix,用户承担以下责任 创建既满足任务表模式条件的任务表,又满足任务表模式的条件,但 并根据用户的业务需求进行必要的修改。 你可以利用 Spring Cloud 任务模式 DDL 作为创建自己任务 DDL 的指南,如此处所示。spring-doc.cadn.net.cn

启用/禁用表初始化

如果你正在创建任务表,但不希望 Spring Cloud 任务 在任务启动时创建它们,设置spring.cloud.task.initialize-enabled属性到false如下:spring-doc.cadn.net.cn

Spring.cloud.task.initialize-enabled=falsespring-doc.cadn.net.cn

它默认为true.spring-doc.cadn.net.cn

该物业spring.cloud.task.initialize.enable已被弃用。

外部生成的任务ID

在某些情况下,你可能想考虑任务时间之间的时间差 以及基础设施实际启动时。春云任务让你 创建一个任务执行当任务被要求时。然后传递执行 ID 生成任务执行对任务进行更新任务执行通过 任务生命周期。spring-doc.cadn.net.cn

一个任务执行可以通过调用createTaskExecution方法 实现任务仓库该数据库引用了 这任务执行对象。spring-doc.cadn.net.cn

为了配置你的任务以使用生成的任务执行ID,添加 以下物业:spring-doc.cadn.net.cn

spring.cloud.task.executionid=yourtaskIdspring-doc.cadn.net.cn

外部任务ID

Spring Cloud Task允许你为每个任务存储一个外部任务ID任务执行.为了配置你的任务以使用生成的任务执行ID,添加 以下物业:spring-doc.cadn.net.cn

spring.cloud.task.external-execution-id=<externalTaskId>spring-doc.cadn.net.cn

父任务ID

Spring Cloud Task允许你为每个任务存储父任务ID。任务执行.一个例子 这通常是执行另一个或多个任务的任务,你想记录哪个任务 启动了每个孩子任务。为了配置你的任务设置父任务执行ID在子任务上添加以下属性:spring-doc.cadn.net.cn

spring.cloud.task.parent-execution-id=<parentExecutionTaskId>spring-doc.cadn.net.cn

TaskConfigurer

TaskConfigurer这是一个策略界面,允许你自定义组件的方式 春云任务已配置完成。默认情况下,我们会提供DefaultTaskConfigurer那 提供逻辑默认值:地图基于内存组件(如果不存在,则对开发有用数据来源提供的)以及基于JDBC的组件(如果存在数据来源可得)。spring-doc.cadn.net.cn

TaskConfigurer允许你配置三个主要组件:spring-doc.cadn.net.cn

元件 描述 默认(提供者DefaultTaskConfigurer)

任务仓库spring-doc.cadn.net.cn

实施任务仓库被使用。spring-doc.cadn.net.cn

简单任务仓库spring-doc.cadn.net.cn

任务探索器spring-doc.cadn.net.cn

实施任务探索器(任务只读访问的组件 用于存储库。spring-doc.cadn.net.cn

SimpleTaskExplorerspring-doc.cadn.net.cn

PlatformTransactionManagerspring-doc.cadn.net.cn

一个用于任务更新时使用的事务管理器。spring-doc.cadn.net.cn

JdbcTransactionManager如果数据来源被使用。ResourcelessTransactionManager如果不是的话。spring-doc.cadn.net.cn

你可以通过创建一个 自定义实现TaskConfigurer接口。通常,扩展DefaultTaskConfigurer(如果TaskConfigurer未找到)和 覆盖所需的除数就足够了。不过,从零开始自己实现 可能需要。spring-doc.cadn.net.cn

用户不应直接使用来自TaskConfigurer径直 除非他们用它来提供被揭露为春豆的实现。

任务执行监听器

任务执行监听器你可以为特定事件注册听众 任务生命周期。为此,创建一个实现任务执行监听器接口。实现任务执行监听器接口会收到以下事件通知:spring-doc.cadn.net.cn

Spring Cloud Task还允许添加任务执行豆子中方法的听众 通过使用以下方法注释:spring-doc.cadn.net.cn

以下示例展示了三种使用的注释:spring-doc.cadn.net.cn

 public class MyBean {

	@BeforeTask
	public void methodA(TaskExecution taskExecution) {
	}

	@AfterTask
	public void methodB(TaskExecution taskExecution) {
	}

	@FailedTask
	public void methodC(TaskExecution taskExecution, Throwable throwable) {
	}
}
插入一个ApplicationListener链条中比任务生命周期监听器存在可能会引起意想不到的效果。

任务执行监听器抛出的异常

如果异常被 抛出任务执行监听器事件处理者,所有监听者 该事件处理程序停止。例如,如果三onTaskStartup听众 开始了,第一个onTaskStartup事件处理程序抛出一个异常,另一个 二onTaskStartup方法不被调用。然而,其他事件处理程序(onTaskEnd任务失败任务执行监听器被叫到了。spring-doc.cadn.net.cn

任务执行监听器事件处理程序是由ExitCodeEvent报告的退出代码。 如果没有ExitCodeEvent被发射,抛出的异常被评估为 如果它类型为ExitCodeGenerator。 如果是这样,它会返回来自出口代码生成器.否则1被归还。spring-doc.cadn.net.cn

当在onTaskStartup方法中,应用程序的出口代码为1. 如果在其中任意一个onTaskEnd任务失败方法中,应用程序的出口代码将是通过上述规则确定的。spring-doc.cadn.net.cn

在抛入例外的情况下onTaskStartup,onTaskEnd任务失败你无法用 OR 覆盖应用的退出代码ExitCodeExceptionMapper.

离职信息

你可以通过使用任务执行监听器.这通过设置TaskExecution 的 退出消息, 然后传递给任务执行监听器.以下示例显示 一个用@AfterTask 执行监听器:spring-doc.cadn.net.cn

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

离去消息可以设置在任一监听者事件处(onTaskStartup,任务失败onTaskEnd).三位听众的优先顺序如下:spring-doc.cadn.net.cn

例如,如果你设置退出消息对于onTaskStartup任务失败听众和任务在不失败的情况下结束,退出消息来自onTaskStartup存储在仓库中。否则,如果发生故障,则退出消息从 这任务失败是存储的。另外,如果你设置了退出消息带有onTaskEnd听众,退出消息来自onTaskEnd取代 两个onTaskStartup任务失败.spring-doc.cadn.net.cn

限制 Spring Cloud 任务实例

Spring Cloud Task允许你确定只能运行一个任务,且任务名称相同 一次一次。为此,你需要确定任务名称和设置spring.cloud.task.single-instance-enabled=true对于每个任务执行。而第一 任务执行是运行,其他时候尝试运行同一个任务名的任务,spring.cloud.task.single-instance-enabled=true这 任务失败时会出现以下错误信息:名为“application”的任务已经是 运行。默认值spring.cloud.task.single-instance-enabledfalse.这 以下示例展示了如何设置spring.cloud.task.single-instance-enabledtrue:spring-doc.cadn.net.cn

Spring.cloud.task.single-instance-enabled=true 或 falsespring-doc.cadn.net.cn

要使用此功能,您必须在 应用:spring-doc.cadn.net.cn

<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执行并设置spring.cloud.task.single-step-instance-enabled=true作为JVM参数,如下:spring-doc.cadn.net.cn

<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 实现观察

启用任务观测应用运行者命令线跑者设置spring.cloud.task.observation.enabled真是太真实了。spring-doc.cadn.net.cn

一个带有观测值的任务示例应用使得使用SimpleMeterRegistry可以在这里找到spring-doc.cadn.net.cn

禁用 Spring Cloud 任务自动配置

如果 Spring Cloud 任务不应该被自动配置用于某个实现,你可以禁用 Task 的自动配置。 这可以通过在任务应用中添加以下注释来实现:spring-doc.cadn.net.cn

@EnableAutoConfiguration(exclude={SimpleTaskAutoConfiguration.class})

你也可以通过设置spring.cloud.task.autoconfiguration.enabled属性到false.spring-doc.cadn.net.cn

闭合语境

如果申请要求应用上下文在 完成一项任务(所有*跑者#跑方法已被调用,任务 仓库已更新),设置了属性spring.cloud.task.closecontextEnabledtrue.spring-doc.cadn.net.cn

另一种关闭上下文的情况是任务执行完成但应用程序未终止。 在这种情况下,上下文保持开放,因为线程已被分配 (例如:如果你使用TaskExecutor)。在这种情况下 设置spring.cloud.task.closecontextEnabled属性到true在启动任务时。 任务完成后,这会关闭应用的上下文。 从而允许应用终止。spring-doc.cadn.net.cn

启用任务指标

Spring Cloud Task与Micrometer集成,并为其执行的任务创建观测值。 要启用任务可观察性集成,必须添加Spring-启动-执行器,你偏好的注册表实现(如果你想发布度量),以及微米追踪(如果你想发布追踪数据)到你的任务应用。 利用 Influx 实现任务可观察性和度量的 maven 依赖示例集如下:spring-doc.cadn.net.cn

<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 Boot 提供了spring.task而春云任务则提供spring.cloud.task性能。 这曾导致过去对这两类性质直接相关产生一些混淆。然而,它们代表了 Spring 生态系统中提供的两类不同功能。spring-doc.cadn.net.cn