Spring Cloud Task 参考指南
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Task 参考指南相关的知识,希望对你有一定的参考价值。
本节简要概述了 Spring Cloud Task 参考文档。 将其视为文档其余部分的地图。您可以在 线性时尚,或者如果您不感兴趣,您可以跳过部分。
1. 关于文档
Spring Cloud Task 参考指南有html和pdf,epub 版本。这 最新副本可在docs.spring.io/spring-cloud-task/docs/current-SNAPSHOT/reference/html/ 获得。
本文档的副本可能供您自己使用和分发给他人, 前提是您不对此类副本收取任何费用,并且每个 副本包含本版权声明,无论是以印刷形式还是以电子方式分发。
2. 获得帮助
在使用 Spring Cloud Task 时遇到问题?我们愿意提供帮助!
- 问一个问题。我们监控stackoverflow.com的问题 标记为弹簧云任务。
- 在github.com/spring-cloud/spring-cloud-task/issues 时报告Spring Cloud Task的错误。
所有的Spring Cloud Task都是开源的,包括文档。如果您发现 文档有问题,或者如果您只是想改进它们,请获取 牵涉其中。 |
3. 第一步
如果您刚刚开始使用Spring Cloud Task或一般的“Spring”,我们 建议阅读入门章节。
要从头开始,请阅读以下部分:
- 春季云任务简介
- 系统要求
要按照本教程进行操作,请阅读开发您的第一个 Spring 云任务应用程序要运行您的示例,请阅读运行示例
开始
如果您刚刚开始使用Spring Cloud Task,则应阅读本节。 在这里,我们回答基本的“什么?”,“如何?”和“为什么?”问题。我们从一个 温柔地介绍春云任务。然后我们构建一个 Spring Cloud Task 应用程序, 边走边讨论一些核心原则。
4. 引入春云任务
Spring Cloud Task 可以轻松创建短期微服务。它提供 允许在生产中按需执行短期 JVM 进程的功能 环境。
5. 系统要求
您需要安装 Java(Java 8 或更高版本)。要构建,您需要拥有Maven 也已安装。
5.1. 数据库要求
Spring Cloud Task 使用关系数据库来存储已执行任务的结果。 虽然您可以在没有数据库的情况下开始开发任务(记录任务的状态 作为任务存储库更新的一部分),对于生产环境,您希望 使用受支持的数据库。Spring Cloud Task 目前支持以下数据库:
- 电子仓库
- H2
- 恒青铁银行
- mysql
- 神谕
- 波斯特格雷斯
- SqlServer
6. 开发您的第一个春季云任务应用程序
一个好的起点是一个简单的“Hello, World!”应用程序,所以我们创建了 春云任务等效于突出框架功能。大多数 IDE 都有 对Apache Maven的良好支持,因此我们将其用作该项目的构建工具。
spring.io 网站包含许多“入门” 使用弹簧引导的指南。如果您需要解决特定问题,请先检查那里。 您可以通过转到Spring 初始化并创建一个新项目来缩短以下步骤。这样做 自动生成新的项目结构,以便您可以立即开始编码。 我们建议尝试使用 Spring Initializr 来熟悉它。 |
6.1. 使用 Spring 初始化创建 Spring 任务项目
现在,我们可以创建并测试打印到控制台的应用程序。Hello, World!
为此:
- 访问Spring Initialzr网站。
- 创建一个新的 Maven 项目,其组名为 和工件名称 。
io.spring.demo
helloworld
- 在“依赖项”文本框中,键入并选择依赖项。
task
Cloud Task
- 在“依赖项”文本框中,键入并选择依赖项。
jdbc
JDBC
- 在“依赖项”文本框中,键入并选择。(或您喜欢的数据库)
h2
H2
- 单击生成项目按钮
- 解压缩 helloworld.zip 文件并将项目导入到您喜欢的 IDE 中。
6.2. 编写代码
要完成我们的应用程序,我们需要更新生成的以下内容,以便它启动任务。HelloworldApplication
package io.spring.demo.helloworld;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@EnableTask
public class HelloworldApplication
@Bean
public CommandLineRunner commandLineRunner()
return new HelloWorldCommandLineRunner();
public static void main(String[] args)
SpringApplication.run(HelloworldApplication.class, args);
public static class HelloWorldCommandLineRunner implements CommandLineRunner
@Override
public void run(String... strings) throws Exception
System.out.println("Hello, World!");
虽然看起来很小,但很多事情正在发生。更多关于春天的信息 引导细节,请参阅Spring 引导参考文档。
现在我们可以打开文件了。 我们需要在以下位置配置两个属性:application.properties
src/main/resources
application.properties
-
application.name
:设置应用程序名称(转换为任务名称) -
logging.level
:要将 Spring Cloud Task 的日志记录设置为 了解正在发生的事情。DEBUG
以下示例演示如何同时执行这两项操作:
logging.level.org.springframework.cloud.task=DEBUG
spring.application.name=helloWorld
6.2.1. 任务自动配置
当包含 Spring Cloud Task Starter 依赖项时,Task auto 会配置所有 bean 以引导其功能。 此配置的一部分注册了供其使用的基础结构。TaskRepository
在我们的演示中,使用嵌入式 H2 数据库来记录结果 的任务。此 H2 嵌入式数据库不是生产环境的实用解决方案,因为 任务结束后,H2 DB 将消失。但是,为了快速入门 经验,我们可以在我们的示例中使用它,并将正在更新的内容回显到日志中 在该存储库中。在“配置”部分中(稍后在此 文档),我们将介绍如何自定义由 春云任务。TaskRepository
当我们的示例应用程序运行时,Spring Boot 会启动我们的消息,并将我们的“Hello, World!”消息输出到标准输出。在存储库中记录任务的开始和任务的结束。HelloWorldCommandLineRunner
TaskLifecycleListener
6.2.2. 主要方法
main 方法充当任何 Java 应用程序的入口点。我们的主要方法 代表 Spring Boot 的SpringApplication类。
6.2.3. 命令行运行程序
Spring 包含许多引导应用程序逻辑的方法。弹簧启动提供 通过其接口以有组织的方式执行此操作的便捷方法 (或)。一个行为良好的任务可以引导任何 使用这两个运行器之一进行逻辑。*Runner
CommandLineRunner
ApplicationRunner
任务的生命周期从执行方法之前考虑 一旦它们全部完成。Spring Boot 允许应用程序使用多个实现,Spring Cloud Task 也是如此。*Runner#run
*Runner
任何从aor以外的机制引导的处理(例如通过使用)都不是 由春云任务录制。 |
6.3. 运行示例
此时,我们的应用程序应该可以工作了。由于此应用程序是基于 Spring 引导的, 我们可以通过使用从根从命令行运行它 我们的应用程序,如以下示例中所示(及其输出):$ mvn spring-boot:run
$ mvn clean spring-boot:run
....... . . .
....... . . . (Maven log output here)
....... . . .
. ____ _ __ _ _
/\\\\ / ____ __ _ _(_)_ __ __ _ \\ \\ \\ \\
( ( )\\___ | _ | _| | _ \\/ _` | \\ \\ \\ \\
\\\\/ ___)| |_)| | | | | || (_| | ) ) ) )
|____| .__|_| |_|_| |_\\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.3.RELEASE)
2018-07-23 17:44:34.426 INFO 1978 --- [ main] i.s.d.helloworld.HelloworldApplication : Starting HelloworldApplication on Glenns-MBP-2.attlocal.net with PID 1978 (/Users/glennrenfro/project/helloworld/target/classes started by glennrenfro in /Users/glennrenfro/project/helloworld)
2018-07-23 17:44:34.430 INFO 1978 --- [ main] i.s.d.helloworld.HelloworldApplication : No active profile set, falling back to default profiles: default
2018-07-23 17:44:34.472 INFO 1978 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1d24f32d: startup date [Mon Jul 23 17:44:34 EDT 2018]; root of context hierarchy
2018-07-23 17:44:35.280 INFO 1978 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2018-07-23 17:44:35.410 INFO 1978 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2018-07-23 17:44:35.419 DEBUG 1978 --- [ main] o.s.c.t.c.SimpleTaskConfiguration : Using org.springframework.cloud.task.configuration.DefaultTaskConfigurer TaskConfigurer
2018-07-23 17:44:35.420 DEBUG 1978 --- [ main] o.s.c.t.c.DefaultTaskConfigurer : No EntityManager was found, using DataSourceTransactionManager
2018-07-23 17:44:35.522 DEBUG 1978 --- [ main] o.s.c.t.r.s.TaskRepositoryInitializer : Initializing task schema for h2 database
2018-07-23 17:44:35.525 INFO 1978 --- [ main] o.s.jdbc.datasource.init.ScriptUtils : Executing SQL script from class path resource [org/springframework/cloud/task/schema-h2.sql]
2018-07-23 17:44:35.558 INFO 1978 --- [ main] o.s.jdbc.datasource.init.ScriptUtils : Executed SQL script from class path resource [org/springframework/cloud/task/schema-h2.sql] in 33 ms.
2018-07-23 17:44:35.728 INFO 1978 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-07-23 17:44:35.730 INFO 1978 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name dataSource has been autodetected for JMX exposure
2018-07-23 17:44:35.733 INFO 1978 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean dataSource: registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2018-07-23 17:44:35.738 INFO 1978 --- [ main] o.s.c.support.DefaultLifecycleProcessor : Starting beans in phase 0
2018-07-23 17:44:35.762 DEBUG 1978 --- [ main] o.s.c.t.r.support.SimpleTaskRepository : Creating: TaskExecutionexecutionId=0, parentExecutionId=null, exitCode=null, taskName=application, startTime=Mon Jul 23 17:44:35 EDT 2018, endTime=null, exitMessage=null, externalExecutionId=null, errorMessage=null, arguments=[]
2018-07-23 17:44:35.772 INFO 1978 --- [ main] i.s.d.helloworld.HelloworldApplication : Started HelloworldApplication in 1.625 seconds (JVM running for 4.764)
Hello, World!
2018-07-23 17:44:35.782 DEBUG 1978 --- [ main] o.s.c.t.r.support.SimpleTaskRepository : Updating: TaskExecution with executionId=1 with the following exitCode=0, endTime=Mon Jul 23 17:44:35 EDT 2018, exitMessage=null, errorMessage=null
前面的输出有三行我们感兴趣的:
-
SimpleTaskRepository
记录了条目的创建。TaskRepository
- 我们的执行,通过“Hello,World!”输出来证明。
CommandLineRunner
-
SimpleTaskRepository
将任务的完成记录在 中。TaskRepository
一个简单的任务应用程序可以在Spring Cloud的示例模块中找到 任务项目在这里。 |
特征
本节将详细介绍Spring Cloud Task,包括如何使用它,如何 以配置它,以及相应的扩展点。
7. 春季云任务的生命周期
在大多数情况下,现代云环境是围绕流程的执行而设计的 预计不会结束。如果它们确实结束,通常会重新启动。虽然大多数 平台确实有某种方法来运行一个在结束时不会重新启动的进程, 该运行的结果通常不会以可使用的方式进行维护。春云 任务提供了在环境中执行短期进程并记录 结果。这样做允许围绕短期进程的微服务架构,如 以及通过消息集成任务而运行时间更长的服务。
虽然此功能在云环境中很有用,但在 传统的部署模型也是如此。当运行 Spring 引导应用程序时,使用 调度程序,如 cron,能够监视 完成后的应用程序。
Spring Cloud Task采用的方法是Spring Boot应用程序可以启动和 结束了,仍然成功。批处理应用程序是如何处理 预期结束(通常是短暂的)可能会有所帮助。
春云任务记录给定任务的生命周期事件。运行时间最长 以大多数 Web 应用程序为代表的进程不会保存其生命周期事件。这 春云任务的核心任务。
生命周期由单个任务执行组成。这是对 Spring Boot 应用程序配置为任务(也就是说,它具有 Sprint Cloud Task 依赖项)。
在任务开始时,在运行任何实现之前,记录开始的条目 事件已创建。此事件通过被触发触发 由弹簧框架。这向系统表明所有 bean 都已准备就绪,并且 在运行任何理论实现之前 由Spring Boot提供。CommandLineRunner
ApplicationRunner
TaskRepository
SmartLifecycle#start
CommandLineRunner
ApplicationRunner
只有在成功引导 a 时,才会记录任务。如果上下文根本无法引导,则任务的运行不会 记录。 |
完成来自 Spring 引导的所有调用或 an(由 an 指示)失败后,任务执行为 使用结果在存储库中更新。*Runner#run
ApplicationContext
ApplicationFailedEvent
如果应用程序需要关闭 完成任务(已调用所有方法和任务 存储库已更新),将属性设置为 true。 |
7.1. 任务执行
存储在中的信息在类中建模,并且 包含以下信息:TaskRepository
TaskExecution
田 | 描述 |
| 任务运行的唯一 ID。 |
| 从实现生成的退出代码。如果没有 生成退出代码,但抛出 ANIS,设置 1。否则,它是 假定为 0。 |
| 任务的名称,由配置的确定。 |
| 任务启动的时间,如调用所示。 |
| 任务完成的时间,如 所示。 |
| 退出时可用的任何信息。这可以通过编程方式由 a 设置。 |
| 如果异常是任务结束的原因(如 所示),则该异常的堆栈跟踪将存储在此处。 |
| 字符串命令行参数在传递到可执行文件中时 启动应用程序。 |
7.2. 映射退出代码
任务完成后,它会尝试向操作系统返回退出代码。如果我们看一看 在我们的原始示例中,我们可以看到我们是 不控制我们应用程序的这一方面。因此,如果抛出异常,JVM 返回一个代码,该代码在调试中可能对您有任何用处,也可能没有任何用处。
因此,Spring Boot 提供了一个接口,让您 将未捕获的异常映射到退出代码。这样做可以让您在退出级别指示 代码,出了什么问题。此外,通过以这种方式映射退出代码,Spring Cloud Task 记录返回的退出代码。ExitCodeExceptionMapper
如果任务以 SIG-INT 或 SIG-TERM 终止,则退出代码为零,除非 否则在代码中指定。
任务运行时,退出代码在存储库中存储为 null。 任务完成后,将根据描述的准则存储相应的退出代码 本节前面部分。 |
8. 配置
Spring Cloud Task 提供了一个现成的配置,如 theandclasses 中所定义的那样。本节将演练 默认值以及如何根据需要自定义 Spring Cloud 任务。DefaultTaskConfigurer
SimpleTaskConfiguration
8.1. 数据源
Spring Cloud Task 使用数据源来存储任务执行的结果。由 默认情况下,我们提供 H2 的内存中实例,以提供 引导开发。但是,在生产环境中,您可能希望 配置您自己的。DataSource
如果您的应用程序仅使用单个和同时用作您的业务 架构和任务存储库,您需要做的就是提供任何( 最简单的方法是通过 Spring Boot 的配置约定)。这是由Spring Cloud Task自动用于存储库的。DataSource
DataSource
DataSource
如果应用程序使用多个任务,则需要配置任务 存储库与适当的。此自定义可以通过 的实现。DataSource
DataSource
TaskConfigurer
8.2. 表前缀
的一个可修改属性是任务表的表前缀。由 默认情况下,它们都以 .ande 开头,并且是两个示例。但是,修改此前缀可能存在原因。如果 架构名称需要附加到表名称前面,或者如果有多个任务集 同一架构中需要表,您必须更改表前缀。你可以这样做 通过设置所需的前缀,如下所示:TaskRepository
TASK_
TASK_EXECUTION
TASK_EXECUTION_PARAMS
spring.cloud.task.tablePrefix
spring.cloud.task.tablePrefix=yourPrefix
通过使用,用户承担 创建同时满足任务表架构条件但 具有用户业务需求所需的修改。 在创建自己的任务 DDL 时,您可以使用 Spring Cloud 任务架构 DDL 作为指导,如下所示。spring.cloud.task.tablePrefix
8.3. 启用/禁用表初始化
如果您正在创建任务表并且不希望春云任务 在任务启动时创建它们,将属性设置为,如下所示:spring.cloud.task.initialize-enabled
false
spring.cloud.task.initialize-enabled=false
它默认为。true
该属性已被弃用。 |
8.4. 外部生成的任务ID
在某些情况下,您可能希望允许任务之间的时差 请求以及基础结构实际启动它的时间。春云任务让你 创建当请求任务时。然后传递 生成到任务,以便它可以更新通过 任务的生命周期。TaskExecution
TaskExecution
TaskExecution
可以通过在 的实现引用了保存的数据存储 对象。TaskExecution
createTaskExecution
TaskRepository
TaskExecution
为了将任务配置为使用生成的,请添加 以下属性:TaskExecutionId
spring.cloud.task.executionid=yourtaskId
8.5. 外部任务编号
Spring Cloud Task 允许您为每个任务存储一个外部任务 ID。这方面的一个例子是 在平台上启动任务时的 Cloud Foundry。 为了将任务配置为使用生成的,请添加 以下属性:TaskExecution
TaskExecutionId
spring.cloud.task.external-execution-id=<externalTaskId>
8.6. 父任务编号
Spring Cloud Task 允许您为每个任务存储父任务 ID。一个例子 这将是一个执行另一个任务或多个任务的任务,并且您想要记录哪个任务 启动每个子任务。为了配置您的任务以设置父任务在子任务上添加以下属性:TaskExecution
TaskExecutionId
spring.cloud.task.parent-execution-id=<parentExecutionTaskId>
8.7. 任务配置器
这是一个策略界面,可让您自定义组件的方式 配置了春季云任务。默认情况下,我们提供 提供逻辑缺省值:基于内存中的组件(如果提供 nois 则对开发有用)和基于 JDBC 的组件(如果可用,则很有用)。TaskConfigurer
DefaultTaskConfigurer
Map
DataSource
DataSource
允许您配置三个主要组件:TaskConfigurer
元件 | 描述 | 默认值(由 |
| 要使用的实现。 | |
| 实现(用于对任务进行只读访问的组件 存储库)要使用的。 | |
| 运行任务更新时要使用的事务管理器。 | |
您可以通过创建 接口的自定义实现。通常,扩展(如果未找到 ais 则提供)和 覆盖所需的吸气剂就足够了。但是,从头开始实现自己的 可能需要。TaskConfigurer
DefaultTaskConfigurer
TaskConfigurer
用户不应直接使用直接的 getter 方法 除非他们使用它来提供要作为 Spring Bean 公开的实现。 |
8.8. 任务名称
在大多数情况下,任务的名称是在 Spring 中配置的应用程序名称 靴子。但是,在某些情况下,您可能希望将任务的运行映射到 不同名称。Spring Cloud Data Flow 就是一个例子(因为您可能想要 使用任务定义的名称运行的任务)。正因为如此,我们提供 能够通过界面自定义任务的命名方式。TaskNameResolver
默认情况下,Spring Cloud Task 提供,它使用 以下选项(按优先级顺序):SimpleTaskNameResolver
- 调用的 Spring Boot 属性(以 Spring Boot 允许的任何方式配置)。
spring.cloud.task.name
- 使用 Spring Boot 的规则解析的应用程序名称(通过 获得)。
ApplicationContext#getId
8.9. 任务执行监听器
TaskExecutionListener
允许您为期间发生的特定事件注册侦听器 任务生命周期。为此,请创建一个实现接口的类。实现接口的类会收到以下事件的通知:TaskExecutionListener
TaskExecutionListener
-
onTaskStartup
:在存储之前。TaskExecution
TaskRepository
-
onTaskEnd
:在更新条目之前 标记任务的最终状态。TaskExecution
TaskRepository
-
onTaskFailed
:在未处理时调用方法之前 任务引发异常。onTaskEnd
Spring Cloud Task 还允许您将侦听器添加到 Bean 中的方法 通过使用以下方法批注:TaskExecution
-
@BeforeTask
:在存储之前TaskExecution
TaskRepository
-
@AfterTask
:在更新条目之前,标记任务的最终状态。TaskExecution
TaskRepository
-
@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)
在链中插入比存在更早的链可能会导致意外效果。 |
8.9.1. 任务执行侦听器抛出的异常
如果事件处理程序引发异常,则所有侦听器 该事件处理程序的处理停止。例如,如果三个侦听器 已启动,第一个事件处理程序引发异常,另一个 不调用两个方法。但是,调用了其他事件处理程序(和)。TaskExecutionListener
onTaskStartup
onTaskStartup
onTaskStartup
onTaskEnd
onTaskFailed
TaskExecutionListeners
事件处理程序引发异常时返回的退出代码是ExitCodeEvent 报告的退出代码。 如果发出 nois,则评估引发的异常以查看 如果它是退出代码生成器的类型。 如果是这样,它将返回退出代码。否则,返回。TaskExecutionListener
ExitCodeEvent
ExitCodeGenerator
1
如果在方法中引发异常,则应用程序的退出代码将是。 如果在任一主方法中引发异常,则应用程序的退出代码将是使用上面列举的规则建立的代码。onTaskStartup
1
onTaskEnd
onTaskFailed