概述
本文是Spring Cloud Task系列的第三篇文章,如果你尚未使用过Spring Cloud Task,请
移步spring cloud task1 简介与示例。
Spring Cloud Task开箱即用的属性配置项由DefaultTaskConfigurer
和SimpleTaskConfiguration
类来管理,本篇文章对Spring Cloud Task的各个方面的默认配置项进行分析,循序渐进,再讨论如何根据实际业务需求去定制Spring Cloud Task的配置。
主要内容
数据源配置
1. 数据源选择
spring cloud task使用数据源(如mysql)来存储task的执行结果。如果没有自定义配置数据源,则默认使用 H2 嵌入式内存数据库作为数据源来启动发布task。不过内存数据库中存储的task信息并没有被持久化,所以在生产环境下我们需要配置自己的数据源。
如果你的应用中只有一个DataSource
,Spring Cloud Task默认会用task仓库管理此数据源。被task仓库管理数据源里不但存储有你的业务数据,还会有task仓库的相关数据定义与记录。单数据源应用是最为简单方便的,很适合小型应用。
当应用中有多个数据源时,框架支持根据业务需求选择最合适数据源存储的任务信息数据。通过自定义继承自TaskConfigure
的配置类可以达到在多数据源情况下选择合适的任务数据源的目的。
2. 任务表前缀
Spring Cloud Task支持自定义任务仓库所管理的数据库表表名的前缀,默认情况下表名前缀是 TASK_ ,像 TASK_EXCUTION 、TASK_EXECUTION_PARAMS 这两张表表名都是以 TASK_ 开头的。在特殊情况下可能会有需要自定义表前缀的需求,如数据库先前就已经定义好了表名,或在该数据源中已经存在了不同业务需求的任务仓库所定义的任务相关的表,这些都需要我们改变任务仓库数据表的表名前缀。
通过设置spring.cloud.task.tablePrefix
属性,可以自定义表名前缀
spring.cloud.task.tablePrefix=<yourPrefix>
3. 开启/关闭数据库表初始化
Spring Cloud Task会在task启动时自动在数据源中创建任务相关的表,如果数据源中已经存在这些表,设置spring.cloud.task.initialize.enable
的值为false
就可以关闭自动建表的功能,该属性的默认值为true
。
spring.cloud.task.initialize.enable=<true or false>
任务task id配置
1. 外部生成任务的Task Id
考虑到任务被请求和基础设施实际执行之间的时间差,Spirng Cloud Task允许用户在任务被请求时创建一个任务实例,任务执行实例会生成一个Task Id,通过这个Task Id就可以跟踪任务的执行情况并实时对任务执行实例进行调整。
在任务仓库TaskRepository
的实现类里调用createTaskExecution
方法就可以创建并持久化一个任务执行实例。
使用下面的配置可以让你的任务使用自动生成的任务id。
spring.cloud.task.executionid=<yourtaskId>
2. 外部任务Task Id
Spring Cloud Task允许用户为任务执行实例保存一个外部的任务id,例如当任务在平台上启动时,Cloud Foundry会为任务提供一个task id。使用下面的配置可以让你的任务使用外部生成的task id。
spring.cloud.task.external-execution-id=<externalTaskId>
3. 父任务Task Id
Spirng Cloud Task允许任务执行实例保存其父任务的task id。如果在一个任务执行的过程中调用了另一个任务,一般情况下,我们会在子任务中保存其父任务的id以方便数据查找或任务出现问题时跟踪维护。此时可以在子任务中配置以下属性来完成保存父任务task id的需求。
spring.cloud.task.parent-execution-id=<parentExecutionTaskId>
任务配置
1. TaskConfigurer
TaskConfigurer
是一个允许用户自定义Spring Cloud Task组件配置的策略接口,其默认实现DefaultTaskConfigurer
提供了应用的默认逻辑(当应用上下文中没有DataSource
时使用内存Map
作为任务仓库存储。当上下文中有DataSource
时,使用依赖于 JDBC 的组件实现任务仓库。)。
TaskConfigurer
主要包含三种组件,如表1所示。
组件名 | 描述 | 默认值(由 TaskConfigurer 提供) |
---|---|---|
TaskRepository |
TaskRepository 接口的实现类,作为任务仓库使用 |
SimpleTaskRepository |
TaskExplorer |
TaskExplorer 接口的实现类(任务探测器是只读访问任务仓库的组件) |
SimpleTaskExplorer |
PlatformTransactionManager |
对任务仓库执行更新操作时所使用的事务管理器 | 如果应用上下文中配置有DataSource ,默认的事务管理器为DataSourceTransactionManager 。如果应用上下文中没有数据源,则默认的事务管理器是ResourcelessTransactionManager 。 |
表1 TaskConfigurer
的三种主要组件
在定制 TaskConfigurer
时推荐直接继承已有的成熟TaskConfigurer
接口,例如继承 DefaultTaskConfigurer
,覆盖所需要的getter就足够了。否则的话,你需要重写整个 TaskConfigurer
的逻辑。
2. 任务名
大多数情况下,Spring Boot中所配置的应用名就是任务名。不过有时可能需要为任务指定一个其它的名字,比如在使用Spring Data Flow平台(任务名一般是随任务定义的名称而改变)时,就需要一种能够自定义任务名的方法了。
Spring Cloud Task提供了 TaskNameResolver
接口来定制任务名,其默认实现是 SimpleTaskNameResolver
类,可以通过下面两种方式来使用SimpleTaskNameResolver
。
- Spring Boot 的属性(任意一种配置 Spring Boot 属性的方法都可以)
spring.cloud.task.name
。 - 经由 Spring Boot 的规则获取到的应用名(通过
ApplicationContext#getId
方法获取)。
任务执行监听器配置
任务执行监听器由TaskExecutionListener
接口的实现类担任,其允许用户注册监听task生命周期中发生的特定事件。当task发生下面三种事件时,监听器会得到通知。
-
onTaskStartup
- 在TaskExecution
存储进TaskRepository
之前。 -
onTaskEnd
- 在修改TaskRepository
中所存储的TaskExecution
数据的最终状态之前。 -
onTaskFailed
- 在任务抛出一个无法处理的异常后,将要调用onTaskEnd
方法之前。
Spring Cloud Task 还支持在 bean 的方法上添加注解的方式来为任务执行实例 TaskExecution
添加事件监听处理逻辑。详见下面三个注解。
-
@BeforeTask
- 表示使用指定方法处理onTaskStartup
事件。 -
@AfterTask
- 表示使用指定方法处理onTaskEnd
事件。 -
@FailedTask
- 表示使用指定方法处理onTaskFailed
事件。
代码1是这三个注解的使用示例。
public class MyBean {
@BeforeTask
public void methodA(TaskExecution taskExecution) {
}
@AfterTask
public void methodB(TaskExecution taskExecution) {
}
@FailedTask
public void methodC(TaskExecution taskExecution, Throwable throwable) {
}
}
代码1 事件监听处理注解的使用示例
引用
本文是我在学习使用Spring Cloud Task 时的笔记,在本文的写过过程中参考了大量其它资料,有些材料来源于网络,我由衷的表示感谢,但由于原作者不明,恕不能一一记述。
- Spring Cloud Task Reference Guide.[Michael Minella, Glenn Renfro].v1.2.4RELEASE
- Spring Cloud Task 项目仓库
- Spring Cloud Data Flow Reference Guide#Task
关于
示例源码
Spring Cloud Task learning 的 task-demo-with-datasource 子项目
后记
Spring Cloud Task是一个优秀的项目,但是我找遍网络,也难以找出系统的、准确的中文相关文档。本系列文章以保证对Spring Cloud Task相关概念和设计理解的正确性为标准,尽量采用通俗易懂的语言,希望能给各位带来一些便捷。
本文内容主要是对 Spring Cloud Task 1.2.2-RELEASE 官方文档的翻译,不过作者水平有限,有不尽然的地方敬请指出。本项目和文档中所用的内容仅供学习和研究之用,转载或引用时请指明出处。如果你对文档有疑问或问题,请在项目中给我留言或发email到
weiwei02@vip.qq.com 我的github:
https://github.com/weiwei02/ 我相信技术能够改变世界 。
网友评论