特征

本节将更详细地介绍 Spring Cloud Task,包括如何使用它、如何 进行配置,并配置相应的扩展点。spring-doc.cn

7. Spring Cloud 任务的生命周期

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

虽然此功能在云环境中很有用,但在 传统的部署模型也是如此。当使用 调度程序(例如 cron)中,能够监控 应用程序。spring-doc.cn

Spring Cloud Task 采用的方法是 Spring Boot 应用程序可以有一个 start 和 结束并且仍然成功。批处理应用程序是如何处理 预期会结束(而且通常是短暂的)可能会有所帮助。spring-doc.cn

Spring Cloud Task 记录给定任务的生命周期事件。运行时间最长 以大多数 Web 应用程序为代表的进程不保存其生命周期事件。这 作为 Spring Cloud Task 核心的任务。spring-doc.cn

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

在任务开始时,在运行 any 或 implementation 之前,会有一个记录 start 的条目 事件。此事件是通过被触发来触发的 由 Spring 框架。这向系统表明所有 bean 都已准备就绪,并且 在运行任何 OR 实现之前 由 Spring Boot 提供。CommandLineRunnerApplicationRunnerTaskRepositorySmartLifecycle#startCommandLineRunnerApplicationRunnerspring-doc.cn

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

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

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

7.1. TaskExecution

存储在 中的信息在 类中建模,并且 包含以下信息:TaskRepositoryTaskExecutionspring-doc.cn

描述

executionidspring-doc.cn

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

exitCodespring-doc.cn

从实现生成的退出代码。如果没有 退出代码,但抛出 an,则设置 1。否则,它是 假定为 0。ExitCodeExceptionMapperApplicationFailedEventspring-doc.cn

taskNamespring-doc.cn

任务的名称,由配置的 .TaskNameResolverspring-doc.cn

startTimespring-doc.cn

任务的启动时间,如调用所示。SmartLifecycle#startspring-doc.cn

endTimespring-doc.cn

任务完成的时间,如 所示。ApplicationReadyEventspring-doc.cn

exitMessagespring-doc.cn

退出时可获得的任何信息。这可以通过 .TaskExecutionListenerspring-doc.cn

errorMessagespring-doc.cn

如果异常是任务结束的原因(如 an 所示),则该异常的堆栈跟踪将存储在此处。ApplicationFailedEventspring-doc.cn

argumentsspring-doc.cn

传递到可执行文件中的字符串命令行参数 引导应用程序。Listspring-doc.cn

7.2. 映射退出代码

任务完成后,它会尝试将退出代码返回给操作系统。如果我们看一看 在原始示例中,我们可以看到 而不是控制我们应用程序的那个方面。因此,如果引发异常,JVM 返回一个代码,该代码在调试中可能对您有任何用处,也可能没有用处。spring-doc.cn

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

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

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

8. 配置

Spring Cloud Task 提供了一个现成的配置,如 and 类中所定义。本节将介绍 默认值以及如何根据您的需要自定义 Spring Cloud Task。DefaultTaskConfigurerSimpleTaskConfigurationspring-doc.cn

8.1. 数据源

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

如果您的应用程序仅使用单个 和 ,则同时作为您的业务 schema 和任务存储库中,您需要做的就是提供任何 ( 最简单的方法是通过 Spring Boot 的配置约定)。Spring Cloud Task 会自动将其用于存储库。DataSourceDataSourceDataSourcespring-doc.cn

如果您的应用程序使用多个 ,则需要配置任务 存储库中具有相应的 .此自定义可以通过 的实现。DataSourceDataSourceTaskConfigurerspring-doc.cn

8.2. 表前缀

的一个可修改属性是任务表的表前缀。由 default,它们都以 . 和 是两个例子。但是,有一些可能的原因需要修改此前缀。如果 schema name 需要在表名前面加上,或者如果有多组任务 表,则必须更改表前缀。您可以这样做 将 设置为 您需要的前缀,如下所示:TaskRepositoryTASK_TASK_EXECUTIONTASK_EXECUTION_PARAMSspring.cloud.task.tablePrefixspring-doc.cn

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

通过使用 ,用户承担了以下责任 创建同时满足 Task Table 架构条件但 Task Table Table 以及用户业务需求所需的修改。 在创建自己的任务 DDL 时,您可以使用 Spring Cloud 任务架构 DDL 作为指南,如下所示spring.cloud.task.tablePrefixspring-doc.cn

8.3. 启用/禁用表初始化

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

spring.cloud.task.initialize-enabled=falsespring-doc.cn

它默认为 .truespring-doc.cn

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

8.4. 外部生成的任务 ID

在某些情况下,您可能希望允许任务 请求以及基础设施实际启动它的时间。Spring Cloud Task 允许您 创建 When the task is request。然后传递 generated 传递给任务,以便它可以更新直通 任务的生命周期。TaskExecutionTaskExecutionTaskExecutionspring-doc.cn

A 可以通过在 的实现 that 引用了保存 对象。TaskExecutioncreateTaskExecutionTaskRepositoryTaskExecutionspring-doc.cn

为了将任务配置为使用生成的 ,请添加 以下属性:TaskExecutionIdspring-doc.cn

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

8.5. 外部任务 ID

Spring Cloud Task 允许您为每个 .例如,由 Cloud Foundry(在平台上启动任务时)。 为了将任务配置为使用生成的 ,请添加 以下属性:TaskExecutionTaskExecutionIdspring-doc.cn

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

8.6. 父任务 ID

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

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

8.7. TaskConfigurer

这是一个策略界面,可让您自定义 Spring Cloud Task 的默认情况下,我们提供 提供逻辑默认值:-based in-memory components(如果未提供,则对开发有用)和基于 JDBC 的组件(如果有可用组件,则很有用)。TaskConfigurerDefaultTaskConfigurerMapDataSourceDataSourcespring-doc.cn

允许您配置三个主要组件:TaskConfigurerspring-doc.cn

元件 描述 Default(由DefaultTaskConfigurer)

TaskRepositoryspring-doc.cn

要使用的 implementation of the to be used.TaskRepositoryspring-doc.cn

SimpleTaskRepositoryspring-doc.cn

TaskExplorerspring-doc.cn

(用于对任务进行只读访问的组件) 的实现 repository) 以供使用。TaskExplorerspring-doc.cn

SimpleTaskExplorerspring-doc.cn

PlatformTransactionManagerspring-doc.cn

运行任务更新时使用的事务管理器。spring-doc.cn

DataSourceTransactionManager如果使用 A。 如果不是。DataSourceResourcelessTransactionManagerspring-doc.cn

您可以通过创建 interface 的自定义实现。通常,扩展 (如果未找到 a,则提供) 和 覆盖所需的 getter 就足够了。但是,从头开始实施您自己的 可能需要。TaskConfigurerDefaultTaskConfigurerTaskConfigurerspring-doc.cn

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

8.8. 任务名称

在大多数情况下,任务的名称是在 Spring 中配置的应用程序名称 靴子。但是,在某些情况下,您可能希望将任务的运行映射到 不同的名称。Spring Cloud Data Flow 就是一个例子(因为您可能希望 要使用任务定义名称运行的任务)。因此,我们提供 能够通过界面自定义任务的命名方式。TaskNameResolverspring-doc.cn

默认情况下,Spring Cloud Task 提供 ,它使用 以下选项(按优先顺序):SimpleTaskNameResolverspring-doc.cn

  1. 名为 .spring.cloud.task.namespring-doc.cn

  2. 使用 Spring Boot 的规则(通过 获取 )解析的应用程序名称。ApplicationContext#getIdspring-doc.cn

8.9. 任务执行侦听器

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

  • onTaskStartup:在将 存储到 .TaskExecutionTaskRepositoryspring-doc.cn

  • onTaskEnd:在更新 和 标记任务的最终状态。TaskExecutionTaskRepositoryspring-doc.cn

  • onTaskFailed:在调用方法之前,当 unhandled Exception 由任务抛出。onTaskEndspring-doc.cn

Spring Cloud Task 还允许您将 Listeners 添加到 bean 中的方法 使用以下方法注释:TaskExecutionspring-doc.cn

  • @BeforeTask:在将物品存放到TaskExecutionTaskRepositoryspring-doc.cn

  • @AfterTask:在更新条目之前,标记任务的最终状态。TaskExecutionTaskRepositoryspring-doc.cn

  • @FailedTask:在调用方法之前,当 unhandled Exception 由任务抛出。@AfterTaskspring-doc.cn

以下示例显示了正在使用的三个注释:spring-doc.cn

 public class MyBean {

    @BeforeTask
    public void methodA(TaskExecution taskExecution) {
    }

    @AfterTask
    public void methodB(TaskExecution taskExecution) {
    }

    @FailedTask
    public void methodC(TaskExecution taskExecution, Throwable throwable) {
    }
}
在链中插入早于存在时间的 URL 可能会导致意外效果。ApplicationListenerTaskLifecycleListener

8.9.1. Task Execution Listener 抛出的异常

如果事件处理程序引发异常,则所有侦听器 该事件处理程序的处理将停止。例如,如果三个侦听器 已启动,并且第一个事件处理程序引发异常,则另一个 不调用两个方法。但是,将调用 的其他事件处理程序 ( 和 )。TaskExecutionListeneronTaskStartuponTaskStartuponTaskStartuponTaskEndonTaskFailedTaskExecutionListenersspring-doc.cn

事件处理程序引发异常时返回的退出代码是 ExitCodeEvent 报告的退出代码。 如果未发出,则计算引发的 Exception 以查看 如果它是 ExitCodeGenerator 类型。 如果是这样,它将返回 .否则,返回。TaskExecutionListenerExitCodeEventExitCodeGenerator1spring-doc.cn

如果在方法中引发异常,则应用程序的退出代码将为 . 如果在 a 或 方法中引发异常,则应用程序的退出代码将是使用上面列举的规则建立的代码。onTaskStartup1onTaskEndonTaskFailedspring-doc.cn

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

8.9.2. 退出消息

您可以使用 .这是通过设置 , 然后将其传递到 .以下示例显示了 一个用 :TaskExecutionListenerTaskExecution’sexitMessageTaskExecutionListener@AfterTaskExecutionListenerspring-doc.cn

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

可以在任何侦听器事件 (、 和 ) 中设置 An 。三个侦听器的优先顺序如下:ExitMessageonTaskStartuponTaskFailedonTaskEndspring-doc.cn

  1. onTaskEndspring-doc.cn

  2. onTaskFailedspring-doc.cn

  3. onTaskStartupspring-doc.cn

例如,如果您为 和 侦听器设置了 an,并且任务结束未失败,则 from the 将存储在存储库中。否则,如果发生故障,则 from 的 被存储。此外,如果对侦听器设置 ,则 from 将取代 来自 和 的退出消息。exitMessageonTaskStartuponTaskFailedexitMessageonTaskStartupexitMessageonTaskFailedexitMessageonTaskEndexitMessageonTaskEndonTaskStartuponTaskFailedspring-doc.cn

8.10. 限制 Spring Cloud 任务实例

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

spring.cloud.task.single-instance-enabled=true or falsespring-doc.cn

要使用此功能,您必须将以下 Spring 集成依赖项添加到您的 应用:spring-doc.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,因为此功能 已启用,并且另一个任务正在以相同的任务名称运行。

8.11. 禁用 Spring Cloud 任务自动配置

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

@EnableAutoConfiguration(exclude={SimpleTaskAutoConfiguration.class})

您还可以通过将属性设置为 来禁用 Task auto configuration。spring.cloud.task.autoconfiguration.enabledfalsespring-doc.cn

8.12. 关闭上下文

如果应用程序要求在 完成任务(所有方法都已调用,并且任务 repository has been updated),将属性设置为 。ApplicationContext*Runner#runspring.cloud.task.closecontextEnabledtruespring-doc.cn

关闭上下文的另一种情况是 Task Execution 完成,但应用程序不会终止。 在这些情况下,上下文保持打开状态,因为已分配线程 (例如:如果您使用的是 TaskExecutor)。在这些情况下 将 Property 设置为 When Launch your task。 这将在任务完成后关闭应用程序的上下文。 从而允许应用程序终止。spring.cloud.task.closecontextEnabledtruespring-doc.cn