SpringBatch监控 您所在的位置:网站首页 springbatch性能优化 SpringBatch监控

SpringBatch监控

2024-06-20 12:13| 来源: 网络整理| 查看: 265

前言:

网上关于spring batch监控的文章少之又少,或者讲得太过简略。在这里记录一下自己的学习心得,供后来者参考。

正文:

        当前管理、监控Spring Batch的开源项目主要有两个,一是Spring Batch Admin,但它在2017年底就停止更新和维护了,也并入了第二个项目,也就是Spring Cloud Data Flow。当前Data Flow的最新版是2.0,稳定版是1.7,每个版本提供了3种平台的实现:Local Server、Cloud Foundry和Kubernetes Server,第一种是单机的、本地的,后两种是云平台的。

       Spring Cloud Data Flow是用于构建数据集成和实时数据处理的工具包,它主要的管理对象是 Spring Cloud Stream和 Spring Cloud Task,这两者都是 Spring Boot微服务框架构建的应用程序。 Spring Cloud Strean用于实时处理源源不断的数据流,是长期的( long lived),就像web服务器一样,24小时服务,没有特殊情况不会终止。Spring Cloud Task用于处理一组有限的数据,处理完成后就结束了,是短期的(short lived)。一次 Spring Application的运行,就算一个task,根据数据库的序列(TASK_SEQ表,该表可以当成序列来理解),自动生成一个 task execution id,本次运行的taskname就是配置文件中的 spring application name配置的应用名称。

       Spring Cloud Task可以集成 Spring Batch,在数据库层面就是通过 TASK_TASK_BATCH表( Spring Cloud Task的表默认是以TASK_为前缀),将 TASK_EXECUTION_ID和 JOB_EXECUTION_ID联系起来。一次Spring Application运行可能同时启动多个job,也可能多次 Spring Application都运行同个job(比如job失败后的重启),所以task和job不是简单的一对一关系或一对多关系。通过 Spring Cloud Task和 Spring Batch的关联关系,Data Flow由此可以管理、监控 Spring Bach。所以要使用 Data Flow的话,Spring Batch应用要做 Spring Cloud Task改造。Data Flow提供了shel和 dashboard两种管理方式,前者是命令行,比较复杂,还需要启动单独的jar包(spring-cloud-dataflow-shell-1.7.3.RELEASE.jar)。后者是自带的页面,简单清晰,能够很好的监控、重启、停止 Spring Batch。

      从官网https://cloud.spring.io/spring-cloud-dataflow/   下载jar包后(我下载的是1.7版本),打开命令行,进入jar包所在的目录,键入命令java -jar spring-cloud-dataflow-server-local-1.7.3.RELEASE.jar --spring.datasource.url=jdbc:mysql://localhost:3306/dataflow --spring.datasource.username=root --spring.datasource.password=123456 --spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

当然该命令能启动的前提是环境是jdk1.8以上,并且本地有mysql数据库,账户名/密码是root/123456,其中一个数据库名为dataflow。

dataflow启动后就可以访问 http://localhost:9393/dashboard

其中Jobs就是监控Spring Batch的地方。当然,Spring Batch首先要做Spring Cloud Task改造之后,才能在这里显示,单纯的Spring Batch启动的job是无法被Data Flow监控的。

       下面说一下如何做Spring Cloud Task改造

       首先maven引入依赖

                            org.mariadb.jdbc             mariadb-java-client             1.1.7                                               org.springframework.cloud             spring-cloud-starter-task             1.2.2.RELEASE                                                 org.springframework.cloud             spring-cloud-task-batch             1.2.2.RELEASE         

       如果有多个数据源,覆盖Configurer

   @Bean     public TaskConfigurer taskConfigurer(@Qualifier("batchDataSource") DataSource dataSource)     {         return new DefaultTaskConfigurer(dataSource);     }

   @Bean     public BatchConfigurer batchConfigurer(@Qualifier("batchDataSource") DataSource dataSource)     {         return new DefaultBatchConfigurer(dataSource);     }

       在启动类或配置类上添加@EnableTask

       spring.application.name配置名称,该名称就是task的名字,该名称要和在Data Flow注册的task name一致。

       注意:Spring Batch、Spring Cloud Task和Spring Cloud Data Flow都要连同一个数据库,也就是说它们的元数据要放在一起。

       这样就能将Spring Cloud Task和Spring Batch结合起来了,每次Spring Appliaction运行时,task和job自动关联。在Data Flow里也就能监控到job和step的数据。

       Data Flow能做的不光是监控,还能停止(stop)或重启(restart)Job。

       stop原理        Data Flow和 Spring Batch应用是可以在不同的机器上的,它们之间交互的方式就是通过数据库。 Data Flow接收到请求后调用 JobExecution的stop方法修改数据库字段,修改了之后,停止不会立即发生,要等到 Spring Batch下一次去读数据库状态的时候才能发现状态被改了,然后才停止。比如设置 Spring Batch的 chunk是10,意味着处理了10个数据一次性写,在处理数据的过程中,如果数据库字段被改了,它是不知道的,只有等10个都处理完了,一次性写入之后,再去检查数据库字段才能发现,然后停止。

       restart原理        Spring Batch使用 jobName和 jobParameter唯一标识一个job实例,jobName一般是不会变的,所以只要带着相同的 jobParameter再次执行就可以重启。如果要使用 Data flow进行重启,需要将 Spring Batch的可执行jar在 Data Flow进行注册,也就是让 Data Flow能够知道jar的位置,重启时才能执行这个jar。Data Flow的重启本质上重启的是task,只是这个task关联job,所以能把job重启了。重启时把task和job的名称和参数从数据取出,再次执行。 PS:重是在 Data Flow的服务器上做的。

       Data Flow注册

       注册就是让Data Flow知道在哪能找到jar,可以用maven或file的方式,以file方式为例。

       这里是Spring Cloud Task,所以类型选择Task

       然后创建Task

       这样子就能重启job了。

       Spring Batch所在的机器断电或者其他导致 Spring Batch进程直接挂了的时候,断点重启是失败的。这是因为进程如果突然挂了,自然就没法将“作业终止”这个信息写入数据库,即 BATCH JOB EXECUTION表的 STATUS字段依旧是 STARTED,END TIME字段为空也就是说仍保留着“作业运行中”的状态,所以是做不了断点重启的。处理的方法是将 STATUS字段改成 STOPPED,给 END TIME字段赋值。

       Data Flow的Dashboard页面虽然可以监控、重启、停止 Spring Batch,但需要注意的是它主要的管理对象是 Spring Cloud Stream和 Spring Cloud Task,关于Spring Batch的监控只是它的一部分内容,而且对Spring Batch的监控、重启、停止,本质上是对Spring Cloud Task的的监控、重启、停止。

       Dashboard页面展示比较“脆弱”,对历史数据(没有做Task改造的Spring Batch遗留的历史数据)非常不友好。如前所述, Data Flow是通过 Spring Cloudask与 Spring Batch的关联关系来管理 Spring Batch的,到了数据库层面就是每个jb都要在 TASK_TASK _BATCH表里找到对应的task,但凡有一个job没有对应的task,页面展示就挂了。这也就意味着意味着历史数据(单纯的 Spring Batch启动留下的历史数据)通过 Data Flow是查不到的。

       Dashboard页面权限管理不精细,它的权限角色分为3种:ⅥEW、CREATE、MANAGE,大致意思是只读、可读写、系统管理,不能做到job级别的权限管理,也就是只要登录了,大家都可以看到样的内容,只要 CREATE权限,就可以停止、重启任意job,所以在生产环境要慎用。

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有