特征
本节将更详细地介绍 Spring Cloud Task,包括如何使用它、如何 进行配置,并配置相应的扩展点。
7. Spring Cloud 任务的生命周期
在大多数情况下,现代云环境是围绕流程的执行而设计的 预计不会结束。如果它们确实结束了,它们通常会重新启动。虽然大多数 平台确实有一些方法可以运行在结束时不会重新启动的进程, 该运行的结果通常不会以可消耗的方式进行维护。Spring Cloud Task 提供了在环境中执行短期进程并记录 结果。这样做允许围绕短期进程构建微服务架构,例如 以及通过消息集成任务来运行时间更长的服务。
虽然此功能在云环境中很有用,但在 传统的部署模型也是如此。当使用 调度程序(例如 cron)中,能够监控 应用程序。
Spring Cloud Task 采用的方法是 Spring Boot 应用程序可以有一个 start 和 结束并且仍然成功。批处理应用程序是如何处理 预期会结束(而且通常是短暂的)可能会有所帮助。
Spring Cloud Task 记录给定任务的生命周期事件。运行时间最长 以大多数 Web 应用程序为代表的进程不保存其生命周期事件。这 作为 Spring Cloud Task 核心的任务。
生命周期由单个任务执行组成。这是 配置为任务的 Spring Boot 应用程序(即,它具有 Sprint Cloud 任务依赖项)。
在任务开始时,在运行 any 或 implementation 之前,会有一个记录 start 的条目
事件。此事件是通过被触发来触发的
由 Spring 框架。这向系统表明所有 bean 都已准备就绪,并且
在运行任何 OR 实现之前
由 Spring Boot 提供。CommandLineRunner
ApplicationRunner
TaskRepository
SmartLifecycle#start
CommandLineRunner
ApplicationRunner
仅当成功引导 .如果上下文根本无法引导,则任务的运行不会
记录。ApplicationContext |
在完成来自 Spring Boot 的所有调用或 an(由 表示)失败后,任务执行为
在存储库中更新结果。*Runner#run
ApplicationContext
ApplicationFailedEvent
如果应用程序要求在
完成任务(所有方法都已调用,并且任务
repository has been updated),请将该属性设置为 true。ApplicationContext *Runner#run spring.cloud.task.closecontextEnabled |
7.1. TaskExecution
存储在 中的信息在 类中建模,并且
包含以下信息:TaskRepository
TaskExecution
田 | 描述 |
---|---|
|
任务运行的唯一 ID。 |
|
从实现生成的退出代码。如果没有
退出代码,但抛出 an,则设置 1。否则,它是
假定为 0。 |
|
任务的名称,由配置的 . |
|
任务的启动时间,如调用所示。 |
|
任务完成的时间,如 所示。 |
|
退出时可获得的任何信息。这可以通过 . |
|
如果异常是任务结束的原因(如 an 所示),则该异常的堆栈跟踪将存储在此处。 |
|
传递到可执行文件中的字符串命令行参数
引导应用程序。 |
7.2. 映射退出代码
任务完成后,它会尝试将退出代码返回给操作系统。如果我们看一看 在原始示例中,我们可以看到 而不是控制我们应用程序的那个方面。因此,如果引发异常,JVM 返回一个代码,该代码在调试中可能对您有任何用处,也可能没有用处。
因此, Spring Boot 提供了一个接口,它允许你
将未捕获的异常映射到退出代码。这样做可以让您在 exit 级别进行指示
代码,出了什么问题。此外,通过以这种方式映射退出代码, Spring Cloud Task
记录返回的退出代码。ExitCodeExceptionMapper
如果任务以 SIG-INT 或 SIG-TERM 终止,则退出代码为零,除非 在代码中另有说明。
在任务运行时,退出代码将作为 null 存储在存储库中。 任务完成后,将根据所描述的准则存储相应的退出代码 在本节的前面部分。 |
8. 配置
Spring Cloud Task 提供了一个现成的配置,如 and 类中所定义。本节将介绍
默认值以及如何根据您的需要自定义 Spring Cloud Task。DefaultTaskConfigurer
SimpleTaskConfiguration
8.1. 数据源
Spring Cloud Task 使用数据源来存储任务执行的结果。由
default,我们提供了一个 H2 的内存实例来提供一个简单的
引导开发。但是,在生产环境中,您可能希望
配置您自己的 .DataSource
如果您的应用程序仅使用单个 和 ,则同时作为您的业务
schema 和任务存储库中,您需要做的就是提供任何 (
最简单的方法是通过 Spring Boot 的配置约定)。Spring Cloud Task 会自动将其用于存储库。DataSource
DataSource
DataSource
如果您的应用程序使用多个 ,则需要配置任务
存储库中具有相应的 .此自定义可以通过
的实现。DataSource
DataSource
TaskConfigurer
8.2. 表前缀
的一个可修改属性是任务表的表前缀。由
default,它们都以 . 和 是两个例子。但是,有一些可能的原因需要修改此前缀。如果
schema name 需要在表名前面加上,或者如果有多组任务
表,则必须更改表前缀。您可以这样做
将 设置为 您需要的前缀,如下所示:TaskRepository
TASK_
TASK_EXECUTION
TASK_EXECUTION_PARAMS
spring.cloud.task.tablePrefix
spring.cloud.task.tablePrefix=yourPrefix
通过使用 ,用户承担了以下责任
创建同时满足 Task Table 架构条件但 Task Table Table
以及用户业务需求所需的修改。
在创建自己的任务 DDL 时,您可以使用 Spring Cloud 任务架构 DDL 作为指南,如下所示。spring.cloud.task.tablePrefix
8.3. 启用/禁用表初始化
如果您正在创建任务表,并且不希望 Spring Cloud Task
在任务启动时创建它们,将属性设置为 ,如下所示:spring.cloud.task.initialize-enabled
false
spring.cloud.task.initialize-enabled=false
它默认为 .true
该属性已被弃用。spring.cloud.task.initialize.enable |
8.4. 外部生成的任务 ID
在某些情况下,您可能希望允许任务
请求以及基础设施实际启动它的时间。Spring Cloud Task 允许您
创建 When the task is request。然后传递
generated 传递给任务,以便它可以更新直通
任务的生命周期。TaskExecution
TaskExecution
TaskExecution
A 可以通过在
的实现 that 引用了保存
对象。TaskExecution
createTaskExecution
TaskRepository
TaskExecution
为了将任务配置为使用生成的 ,请添加
以下属性:TaskExecutionId
spring.cloud.task.executionid=yourtaskId
8.5. 外部任务 ID
Spring Cloud Task 允许您为每个 .例如,由
Cloud Foundry(在平台上启动任务时)。
为了将任务配置为使用生成的 ,请添加
以下属性:TaskExecution
TaskExecutionId
spring.cloud.task.external-execution-id=<externalTaskId>
8.6. 父任务 ID
Spring Cloud Task 允许您为每个 .一个例子
这将是一个执行另一个任务或多个任务的任务,并且您想要记录哪个任务
启动了每个子任务。要配置任务以设置父任务,请在子任务上添加以下属性:TaskExecution
TaskExecutionId
spring.cloud.task.parent-execution-id=<parentExecutionTaskId>
8.7. TaskConfigurer
这是一个策略界面,可让您自定义
Spring Cloud Task 的默认情况下,我们提供
提供逻辑默认值:-based in-memory components(如果未提供,则对开发有用)和基于 JDBC 的组件(如果有可用组件,则很有用)。TaskConfigurer
DefaultTaskConfigurer
Map
DataSource
DataSource
允许您配置三个主要组件:TaskConfigurer
元件 | 描述 | Default(由DefaultTaskConfigurer ) |
---|---|---|
|
要使用的 implementation of the to be used. |
|
|
(用于对任务进行只读访问的组件) 的实现
repository) 以供使用。 |
|
|
运行任务更新时使用的事务管理器。 |
|
您可以通过创建
interface 的自定义实现。通常,扩展 (如果未找到 a,则提供) 和
覆盖所需的 getter 就足够了。但是,从头开始实施您自己的
可能需要。TaskConfigurer
DefaultTaskConfigurer
TaskConfigurer
用户不应直接使用
除非他们使用它来提供要作为 Spring Beans 公开的实现。TaskConfigurer |
8.8. 任务名称
在大多数情况下,任务的名称是在 Spring 中配置的应用程序名称
靴子。但是,在某些情况下,您可能希望将任务的运行映射到
不同的名称。Spring Cloud Data Flow 就是一个例子(因为您可能希望
要使用任务定义名称运行的任务)。因此,我们提供
能够通过界面自定义任务的命名方式。TaskNameResolver
默认情况下,Spring Cloud Task 提供 ,它使用
以下选项(按优先顺序):SimpleTaskNameResolver
-
名为 .
spring.cloud.task.name
-
使用 Spring Boot 的规则(通过 获取 )解析的应用程序名称。
ApplicationContext#getId
8.9. 任务执行侦听器
TaskExecutionListener
允许您为期间发生的特定事件注册侦听器
任务生命周期。为此,请创建一个实现该接口的类。实现该接口的类将收到以下事件的通知:TaskExecutionListener
TaskExecutionListener
-
onTaskStartup
:在将 存储到 .TaskExecution
TaskRepository
-
onTaskEnd
:在更新 和 标记任务的最终状态。TaskExecution
TaskRepository
-
onTaskFailed
:在调用方法之前,当 unhandled Exception 由任务抛出。onTaskEnd
Spring Cloud Task 还允许您将 Listeners 添加到 bean 中的方法
使用以下方法注释:TaskExecution
-
@BeforeTask
:在将物品存放到TaskExecution
TaskRepository
-
@AfterTask
:在更新条目之前,标记任务的最终状态。TaskExecution
TaskRepository
-
@FailedTask
:在调用方法之前,当 unhandled Exception 由任务抛出。@AfterTask
以下示例显示了正在使用的三个注释:
public class MyBean {
@BeforeTask
public void methodA(TaskExecution taskExecution) {
}
@AfterTask
public void methodB(TaskExecution taskExecution) {
}
@FailedTask
public void methodC(TaskExecution taskExecution, Throwable throwable) {
}
}
在链中插入早于存在时间的 URL 可能会导致意外效果。ApplicationListener TaskLifecycleListener |
8.9.1. Task Execution Listener 抛出的异常
如果事件处理程序引发异常,则所有侦听器
该事件处理程序的处理将停止。例如,如果三个侦听器
已启动,并且第一个事件处理程序引发异常,则另一个
不调用两个方法。但是,将调用 的其他事件处理程序 ( 和 )。TaskExecutionListener
onTaskStartup
onTaskStartup
onTaskStartup
onTaskEnd
onTaskFailed
TaskExecutionListeners
事件处理程序引发异常时返回的退出代码是 ExitCodeEvent 报告的退出代码。
如果未发出,则计算引发的 Exception 以查看
如果它是 ExitCodeGenerator 类型。
如果是这样,它将返回 .否则,返回。TaskExecutionListener
ExitCodeEvent
ExitCodeGenerator
1
如果在方法中引发异常,则应用程序的退出代码将为 .
如果在 a 或 方法中引发异常,则应用程序的退出代码将是使用上面列举的规则建立的代码。onTaskStartup
1
onTaskEnd
onTaskFailed
如果在 、 中引发异常,或者您不能使用 覆盖应用程序的退出代码。onTaskStartup onTaskEnd onTaskFailed ExitCodeExceptionMapper |
8.9.2. 退出消息
您可以使用 .这是通过设置 ,
然后将其传递到 .以下示例显示了
一个用 :TaskExecutionListener
TaskExecution’s
exitMessage
TaskExecutionListener
@AfterTask
ExecutionListener
@AfterTask
public void afterMe(TaskExecution taskExecution) {
taskExecution.setExitMessage("AFTER EXIT MESSAGE");
}
可以在任何侦听器事件 (、 和 ) 中设置 An 。三个侦听器的优先顺序如下:ExitMessage
onTaskStartup
onTaskFailed
onTaskEnd
-
onTaskEnd
-
onTaskFailed
-
onTaskStartup
例如,如果您为 和 侦听器设置了 an,并且任务结束未失败,则 from the 将存储在存储库中。否则,如果发生故障,则 from
的 被存储。此外,如果对侦听器设置 ,则 from 将取代
来自 和 的退出消息。exitMessage
onTaskStartup
onTaskFailed
exitMessage
onTaskStartup
exitMessage
onTaskFailed
exitMessage
onTaskEnd
exitMessage
onTaskEnd
onTaskStartup
onTaskFailed
8.10. 限制 Spring Cloud 任务实例
Spring Cloud Task 允许您确定只能运行一个具有给定任务名称的任务
一次。为此,您需要为每个任务执行建立任务名称和设置。虽然第一个
任务执行正在运行,任何其他尝试运行具有相同任务名称和'spring.cloud.task.single-instance-enabled=true'的任务时,
任务失败,并显示以下错误消息:的默认值为 .这
以下示例显示如何设置为 :spring.cloud.task.single-instance-enabled=true
Task with name "application" is already
running.
spring.cloud.task.single-instance-enabled
false
spring.cloud.task.single-instance-enabled
true
spring.cloud.task.single-instance-enabled=true or false
要使用此功能,您必须将以下 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,因为此功能 已启用,并且另一个任务正在以相同的任务名称运行。 |
8.11. 禁用 Spring Cloud 任务自动配置
如果不应为实现自动配置 Spring Cloud Task,则可以禁用 Task 的自动配置。 这可以通过向 Task 应用程序添加以下注释来完成:
@EnableAutoConfiguration(exclude={SimpleTaskAutoConfiguration.class})
您还可以通过将属性设置为 来禁用 Task auto configuration。spring.cloud.task.autoconfiguration.enabled
false
8.12. 关闭上下文
如果应用程序要求在
完成任务(所有方法都已调用,并且任务
repository has been updated),将属性设置为 。ApplicationContext
*Runner#run
spring.cloud.task.closecontextEnabled
true
关闭上下文的另一种情况是 Task Execution 完成,但应用程序不会终止。
在这些情况下,上下文保持打开状态,因为已分配线程
(例如:如果您使用的是 TaskExecutor)。在这些情况下
将 Property 设置为 When Launch your task。
这将在任务完成后关闭应用程序的上下文。
从而允许应用程序终止。spring.cloud.task.closecontextEnabled
true