当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

概述

本文是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 提供)
TaskRepositoryTaskRepository接口的实现类,作为任务仓库使用SimpleTaskRepository
TaskExplorerTaskExplorer接口的实现类(任务探测器是只读访问任务仓库的组件)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/ 我相信技术能够改变世界 。

链接

  • 上篇文章Spring Cloud Task2 生命周期特性与任务仓库数据结构
  • 下篇文章正在准备中

转载于:https://my.oschina.net/weiwei02/blog/1592964

相关文章:

  • node.js
  • 本周末预计更新博客内容
  • 微信开发https服务搭建
  • wii 入门之路--fatt
  • 冒泡排序的多种写法、逻辑
  • 获取 Android 版本
  • 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录
  • 当微信小程序遇上filter~
  • webpack 简单使用
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • wireshark使用教程
  • 移动端高清、多屏适配方案
  • Java线程池
  • Ubuntu中,加速软件下载和安装的方法
  • Exchange批量获取虚拟目录的内部和外部URL
  • 自己简单写的 事件订阅机制
  • [译]如何构建服务器端web组件,为何要构建?
  • Hibernate【inverse和cascade属性】知识要点
  • Javascript弹出层-初探
  • JavaScript的使用你知道几种?(上)
  • JS基础之数据类型、对象、原型、原型链、继承
  • log4j2输出到kafka
  • React-redux的原理以及使用
  • React系列之 Redux 架构模式
  • 对象管理器(defineProperty)学习笔记
  • 深度学习中的信息论知识详解
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 小程序01:wepy框架整合iview webapp UI
  • 延迟脚本的方式
  • 智能网联汽车信息安全
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 如何在招聘中考核.NET架构师
  • ​flutter 代码混淆
  • ​决定德拉瓦州地区版图的关键历史事件
  • #include到底该写在哪
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • ${ }的特别功能
  • (11)MSP430F5529 定时器B
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (k8s中)docker netty OOM问题记录
  • (LeetCode 49)Anagrams
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (vue)页面文件上传获取:action地址
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)Sublime Text3配置Lua运行环境
  • ***原理与防范
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Core引入性能分析引导优化
  • .Net FrameWork总结
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据