[Spring Cloud Task]3 框架配置详解

概述

本文是Spring Cloud Task系列的第三篇文章,如果你尚未使用过Spring Cloud Task,请
移步spring cloud task1 简介与示例

Spring Cloud Task开箱即用的属性配置项由DefaultTaskConfigurerSimpleTaskConfiguration类来管理,本篇文章对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发生下面三种事件时,监听器会得到通知。

  1. onTaskStartup - 在 TaskExecution 存储进 TaskRepository 之前。
  2. onTaskEnd - 在修改 TaskRepository 中所存储的 TaskExecution 数据的最终状态之前。
  3. 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 时的笔记,在本文的写过过程中参考了大量其它资料,有些材料来源于网络,我由衷的表示感谢,但由于原作者不明,恕不能一一记述。

  1. Spring Cloud Task Reference Guide.[Michael Minella, Glenn Renfro].v1.2.4RELEASE
  2. Spring Cloud Task 项目仓库
  3. 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/ 我相信技术能够改变世界 。

链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,333评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,812评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,016评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,293评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,650评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,788评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,003评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,741评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,462评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,681评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,168评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,528评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,169评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,119评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,846评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,719评论 2 274

推荐阅读更多精彩内容