|
该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用 spring-cloud-task 5.0.0! |
特征
本节将更详细介绍春云任务,包括如何使用和作方法 配置它,以及相应的扩展点。
春季云任务的生命周期
在大多数情况下,现代云环境是围绕流程执行设计的 这些都不被期望结束。如果比赛结束,通常会重新开始。虽然大多数 平台确实有某种方式可以运行一个进程,结束时不会重启,比如 该运行的结果通常不会以可消耗的方式保存。春云 任务提供了在环境中执行短寿命进程并记录 结果。这样做可以围绕短寿命进程建立微服务架构,如 以及通过消息整合任务实现更长时间的服务。
虽然此功能在云环境中很有用,但在 传统部署模式也是如此。当运行带有 调度器如Cron,能够监控结果是有用的 申请完成后。
Spring Cloud Task 采用了 Spring Boot 应用程序可以有 start 和 的方法。 一个终结,但仍然成功。批处理应用就是处理这些问题的一个例子 预计会结束(而且通常持续时间很短)是有帮助的。
Spring Cloud 任务记录给定任务的生命周期事件。最长寿作品 进程,大多数Web应用程序的典型特征是,不会保存其生命周期事件。这 春云任务的核心任务。
生命周期仅包含一次任务执行。这是对 Spring Boot 应用程序配置为任务(即具有 Sprint Cloud 任务依赖)。
在任务开始时,在任何事情之前命令线跑者或应用运行者已经运行过实现,在任务仓库那是记录起始的
事件被创造出来。该事件通过以下方式触发SmartLifecycle#start被触发
由Spring Framework出版。这向系统表明所有豆子都已准备好使用,
在运行任何命令线跑者或应用运行者实现
由Spring Boot提供。
任务的记录只有在成功启动应用上下文.如果上下文完全无法引导,任务运行就不算
记录。 |
完成所有*跑者#跑Spring Boot 的呼叫或应用上下文(表示为ApplicationFailedEvent),任务执行为
已在仓库中更新了结果。
如果申请要求应用上下文在
完成一项任务(所有*跑者#跑方法已被调用,任务
仓库已更新),设置了属性spring.cloud.task.closecontextEnabled真是太真实了。 |
任务执行
存储在任务仓库在任务执行类和
包含以下信息:
| 田 | 描述 |
|---|---|
|
任务运行的唯一ID。 |
|
退出代码由 |
|
任务名称,由配置决定 |
|
任务开始的时间,由 |
|
任务完成的时间,由 |
|
退出时可用的任何信息。这可以通过程序化设置 |
|
如果异常是任务结束的原因(如 |
|
一个 |
出口代码映射
任务完成后,会尝试返回作系统的退出代码。如果我们看看 在我们最初的例子中,我们可以看到 不控制我们应用中的这一方面。所以,如果抛出异常,JVM 返回的代码可能对你调试有用,也可能没用。
因此,Spring Boot 提供了以下接口,ExitCodeExceptionMapper,这让你
地图未捕获的出口代码例外。这样做可以在出口层面打方向灯
代码,哪里出了问题。此外,通过这种方式映射出口代码,春云任务
记录返回的出口代码。
如果任务以 SIG-INT 或 SIG-TERM 结束,则退出码为零,除非 代码中另有说明。
| 任务运行时,退出代码会作为空代码存储在仓库中。 任务完成后,根据所述指南存储相应的退出代码 本节前述。 |
配置
Spring Cloud Task 提供即用配置,定义如下DefaultTaskConfigurer和SimpleTaskConfiguration类。本段穿行
默认设置以及如何根据你的需求定制 Spring Cloud 任务。
数据来源
Spring Cloud Task 使用数据源存储任务执行结果。由
默认情况下,我们提供 H2 的内存实例,以提供一个简单的方法
自助开发。不过,在生产环境中,你可能会想
你自己配置数据来源.
如果你的应用只用一个数据来源这既是你的生意
模式和任务仓库,你只需要提供任何数据来源(
最简单的方法是通过 Spring Boot 的配置规范实现)。这数据来源被 Spring Cloud Task 自动用于仓库。
如果你的应用使用多个数据来源,你需要配置任务
带有相应数据来源.这种定制可以通过
实现TaskConfigurer.
表前缀
一个可变性质任务仓库是任务表的表前缀。由
默认情况下,它们都以以下形式开头任务_.TASK_EXECUTION和TASK_EXECUTION_PARAMS是两个例子。不过,修改这个前缀是有原因的。如果
模式名称需要在表名前加上,或者如果有多个任务集
需要在同一模式内的表,你必须更改表前缀。你可以这么做
通过设置spring.cloud.task.tablePrefix到你需要的前缀,具体如下:
spring.cloud.task.tablePrefix=yourPrefix
通过使用spring.cloud.task.tablePrefix,用户承担以下责任
创建既满足任务表模式条件的任务表,又满足任务表模式的条件,但
并根据用户的业务需求进行必要的修改。
你可以利用 Spring Cloud 任务模式 DDL 作为创建自己任务 DDL 的指南,如此处所示。
启用/禁用表初始化
如果你正在创建任务表,但不希望 Spring Cloud 任务
在任务启动时创建它们,设置spring.cloud.task.initialize-enabled属性到false如下:
Spring.cloud.task.initialize-enabled=false
它默认为true.
该物业spring.cloud.task.initialize.enable已被弃用。 |
外部生成的任务ID
在某些情况下,你可能想考虑任务时间之间的时间差
以及基础设施实际启动时。春云任务让你
创建一个任务执行当任务被要求时。然后传递执行 ID
生成任务执行对任务进行更新任务执行通过
任务生命周期。
一个任务执行可以通过调用createTaskExecution方法
实现任务仓库该数据库引用了
这任务执行对象。
为了配置你的任务以使用生成的任务执行ID,添加
以下物业:
spring.cloud.task.executionid=yourtaskId
外部任务ID
Spring Cloud Task允许你为每个任务存储一个外部任务ID任务执行.为了配置你的任务以使用生成的任务执行ID,添加
以下物业:
spring.cloud.task.external-execution-id=<externalTaskId>
父任务ID
Spring Cloud Task允许你为每个任务存储父任务ID。任务执行.一个例子
这通常是执行另一个或多个任务的任务,你想记录哪个任务
启动了每个孩子任务。为了配置你的任务设置父任务执行ID在子任务上添加以下属性:
spring.cloud.task.parent-execution-id=<parentExecutionTaskId>
TaskConfigurer
这TaskConfigurer这是一个策略界面,允许你自定义组件的方式
春云任务已配置完成。默认情况下,我们会提供DefaultTaskConfigurer那
提供逻辑默认值:地图基于内存组件(如果不存在,则对开发有用数据来源提供的)以及基于JDBC的组件(如果存在数据来源可得)。
这TaskConfigurer允许你配置三个主要组件:
| 元件 | 描述 | 默认(提供者DefaultTaskConfigurer) |
|---|---|---|
|
实施 |
|
|
实施 |
|
|
一个用于任务更新时使用的事务管理器。 |
|
你可以通过创建一个
自定义实现TaskConfigurer接口。通常,扩展DefaultTaskConfigurer(如果TaskConfigurer未找到)和
覆盖所需的除数就足够了。不过,从零开始自己实现
可能需要。
用户不应直接使用来自TaskConfigurer径直
除非他们用它来提供被揭露为春豆的实现。 |
任务执行监听器
任务执行监听器你可以为特定事件注册听众
任务生命周期。为此,创建一个实现任务执行监听器接口。实现任务执行监听器接口会收到以下事件通知:
-
onTaskStartup:在存储任务执行进入任务仓库. -
onTaskEnd:在更新任务执行在任务仓库和 标志着任务的最终状态。 -
任务失败:在onTaskEnd当未处理时调用的方法 任务会抛出例外。
Spring Cloud Task还允许添加任务执行豆子中方法的听众
通过使用以下方法注释:
-
@BeforeTask:在存储任务执行进入任务仓库 -
@AfterTask:在更新之前任务执行在任务仓库标志着任务的最终状态。 -
@FailedTask:在@AfterTask当未处理时调用的方法 任务会抛出例外。
以下示例展示了三种使用的注释:
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和任务失败)任务执行监听器被叫到了。
当任务执行监听器事件处理程序是由ExitCodeEvent报告的退出代码。
如果没有ExitCodeEvent被发射,抛出的异常被评估为
如果它类型为ExitCodeGenerator。
如果是这样,它会返回来自出口代码生成器.否则1被归还。
当在onTaskStartup方法中,应用程序的出口代码为1.
如果在其中任意一个onTaskEnd或任务失败方法中,应用程序的出口代码将是通过上述规则确定的。
在抛入例外的情况下onTaskStartup,onTaskEnd或任务失败你无法用 OR 覆盖应用的退出代码ExitCodeExceptionMapper. |
离职信息
你可以通过使用任务执行监听器.这通过设置TaskExecution 的 退出消息,
然后传递给任务执行监听器.以下示例显示
一个用@AfterTask 执行监听器:
@AfterTask
public void afterMe(TaskExecution taskExecution) {
taskExecution.setExitMessage("AFTER EXIT MESSAGE");
}
一离去消息可以设置在任一监听者事件处(onTaskStartup,任务失败和onTaskEnd).三位听众的优先顺序如下:
-
onTaskEnd -
任务失败 -
onTaskStartup
例如,如果你设置退出消息对于onTaskStartup和任务失败听众和任务在不失败的情况下结束,退出消息来自onTaskStartup存储在仓库中。否则,如果发生故障,则退出消息从
这任务失败是存储的。另外,如果你设置了退出消息带有onTaskEnd听众,退出消息来自onTaskEnd取代
两个onTaskStartup和任务失败.
限制 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-enabled是false.这
以下示例展示了如何设置spring.cloud.task.single-instance-enabled自true:
Spring.cloud.task.single-instance-enabled=true 或 false
要使用此功能,您必须在 应用:
<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参数,如下:
<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真是太真实了。
一个带有观测值的任务示例应用使得使用SimpleMeterRegistry可以在这里找到。
禁用 Spring Cloud 任务自动配置
如果 Spring Cloud 任务不应该被自动配置用于某个实现,你可以禁用 Task 的自动配置。 这可以通过在任务应用中添加以下注释来实现:
@EnableAutoConfiguration(exclude={SimpleTaskAutoConfiguration.class})
你也可以通过设置spring.cloud.task.autoconfiguration.enabled属性到false.
闭合语境
如果申请要求应用上下文在
完成一项任务(所有*跑者#跑方法已被调用,任务
仓库已更新),设置了属性spring.cloud.task.closecontextEnabled自true.
另一种关闭上下文的情况是任务执行完成但应用程序未终止。
在这种情况下,上下文保持开放,因为线程已被分配
(例如:如果你使用TaskExecutor)。在这种情况下
设置spring.cloud.task.closecontextEnabled属性到true在启动任务时。
任务完成后,这会关闭应用的上下文。
从而允许应用终止。
启用任务指标
Spring Cloud Task与Micrometer集成,并为其执行的任务创建观测值。
要启用任务可观察性集成,必须添加Spring-启动-执行器,你偏好的注册表实现(如果你想发布度量),以及微米追踪(如果你想发布追踪数据)到你的任务应用。
利用 Influx 实现任务可观察性和度量的 maven 依赖示例集如下:
<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>