Spring Boot 知识集锦之Spring-Batch批处理组件详解

文章目录

  • 0.前言
  • 1.参考文档
  • 2.基础介绍
    • 2.1. 核心组件
  • 3.步骤
    • 3.1. 引入依赖
    • 3.2. 配置文件
    • 3.3. 核心源码
  • 4.示例项目
  • 5.总结

在这里插入图片描述

0.前言

背景: 一直零散的使用着Spring Boot 的各种组件和特性,从未系统性的学习和总结,本次借着这个机会搞一波。共同学习,一起进步。哈哈

在这里插入图片描述

Spring Boot Starter Batch 是基于 Spring Batch 构建的批处理应用程序的开发套件,它为开发者提供了一种简化和便捷的方式来处理大规模数据处理任务。批处理应用程序通常涉及大量数据的读取、处理和写入,而 Spring Batch 提供了强大的功能和组件来管理和执行这些任务。

本文将带你深入探索 Spring Boot Starter Batch 的核心源码和机制, 将介绍作业配置类的创建和使用,以定义作业结构和配置步骤、读取器、处理器、写入器等组件。

你还将了解到作业监听器和步骤监听器的用法,以及如何处理错误和异常情况。通过深入研究 Spring Batch 的核心组件,你将对作业执行器、作业存储库和事务管理器有更深入的了解。

无论你是菜鸟还是大牛,都可以看看指点一番。让我们一起开始这个令人兴奋的探索之旅吧!

1.参考文档

  1. 《SpringBoot集成Spring Batch批处理框架入门案例实战》https://blog.51cto.com/u_15891990/5908727
    以下是一些参考文档,可以帮助你更深入地了解 Spring Boot Starter Batch 的使用和内部机制:

  2. Spring Boot 官方文档提供了关于 Spring Boot Starter Batch 的详细介绍和使用方法。 可以了解如何使用 Spring Boot Starter Batch 来简化批处理应用程序的开发和部署,并深入了解自动配置和属性的使用。

    官方文档链接:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-batch-applications

2.基础介绍

Spring Boot Starter for Batch(spring-boot-starter-batch)是一个用于在 Spring Boot 项目中实现批处理任务的启动器。它是基于 Spring Batch 框架构建的,通过自动配置功能简化了批处理作业的配置和依赖项管理。

Spring Batch 是一个功能强大的开源批处理框架,旨在处理大规模数据处理和批量任务。它提供了读取、处理和写入大量数据的机制,并支持事务管理、错误处理、跳过策略等功能。

使用 Spring Boot Starter for Batch 可以带来以下好处:

  1. 简化配置:Spring Boot Starter for Batch 利用 Spring Boot 的自动配置机制,减少了繁琐的配置步骤,使批处理任务的配置更加简单和直观。
  2. 依赖管理:启动器自动管理 Spring Batch 和其他相关依赖项的版本兼容性,避免了手动解决依赖冲突的问题。
  3. 快速启动:通过使用启动器,你可以快速搭建和启动一个批处理任务,无需手动配置各种依赖项和组件。
  4. 集成监控:Spring Boot Starter for Batch 与 Spring Boot Actuator 集成,提供了监控和管理批处理作业的端点,方便对作业进行跟踪和管理。

要使用 Spring Boot Starter for Batch,你只需在项目的构建文件中添加相应的依赖项,然后配置作业和步骤的读取器、处理器和写入器组件。启动器将自动加载所需的配置和组件,并提供简洁的编程模型来实现批处理任务。

2.1. 核心组件

当构建批处理作业时,Spring Batch 提供了以下核心组件,每个组件都有特定的功能和责任,通过配置和定义它们的行为,可以实现具体的批处理逻辑:
在这里插入图片描述

  1. Job(作业):Job 是批处理的最高级别组件,表示一个完整的批处理作业。它由一个或多个步骤(Step)组成。Job 可以包含作业参数、监听器、错误处理策略等。

  2. Step(步骤):Step 是批处理作业的基本处理单元,表示一个独立的处理步骤。每个步骤可以包含一个 ItemReader、一个 ItemProcessor 和一个 ItemWriter。步骤可以定义事务管理、错误处理、跳过策略等。

  3. ItemReader(读取器):ItemReader 用于读取输入数据。它提供了不同的实现方式,如从文件、数据库、消息队列等读取数据。ItemReader 从源数据中逐条读取数据,并将其传递给 ItemProcessor 进行处理。

  4. ItemProcessor(处理器):ItemProcessor 用于处理输入数据。它接收从 ItemReader 读取的数据,并进行自定义的业务逻辑处理,如数据转换、过滤、验证等。ItemProcessor 可以对输入数据进行任意的处理操作,并返回处理后的数据。

  5. ItemWriter(写入器):ItemWriter 用于写入处理后的数据。它将 ItemProcessor 处理后的数据写入目标位置,如文件、数据库等。ItemWriter 提供了不同的实现方式,以适应不同的输出场景。

这些组件通过配置和组合,形成了一个完整的批处理作业。可以使用 Spring Batch 提供的注解和构建器来定义这些组件,并将它们组装成一个作业流程。例如,可以创建一个 Job,它包含一个或多个 Step,每个 Step 包含一个 ItemReader、一个 ItemProcessor 和一个 ItemWriter。通过定义这些组件的行为和属性,可以实现从输入数据读取、处理、写入输出数据的批处理逻辑。

此外,Spring Batch 还提供了其他辅助组件,如监听器(Listeners)、错误处理(Error Handling)、事务管理(Transaction Management)等,用于监控和管理批处理作业的执行过程和异常情况。这些组件可以通过配置和扩展来实现特定的需求和处理逻辑。

3.步骤

3.1. 引入依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId></dependency>

3.2. 配置文件

可以通过配置文件来自定义和配置批处理作业的行为。常用的配置属性

# 指定要运行的作业的名称
spring.batch.job.names=job1,job2# 是否启用 Spring Batch 的作业
spring.batch.job.enabled=true# 是否在启动时初始化 Spring Batch 的数据库模式
spring.batch.initialize-schema=false# 指定 Spring Batch 的数据库模式(Schema)名称
spring.batch.schema=classpath:org/springframework/batch/core/schema-*.sql# 指定 Spring Batch 数据库表的前缀
spring.batch.table-prefix=BATCH_# 配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/batchdb
spring.datasource.username=root
spring.datasource.password=secret# 配置数据源连接池
spring.datasource.hikari.maximum-pool-size=10# 配置事务管理器
spring.batch.transaction.manager-bean-name=myTransactionManager# 配置作业监听器
spring.batch.job.job-listeners=myJobListener# 配置步骤监听器
spring.batch.step.step-listeners=myStepListener# 配置错误处理策略
spring.batch.job.error-handlers=skipExceptionHandler# 配置作业参数
spring.batch.job.parameters.param1=value1
spring.batch.job.parameters.param2=value2

3.3. 核心源码

Spring Boot Starter Batch 是基于 Spring Batch 构建的批处理应用程序的开发套件,它简化了批处理作业的配置和部署。通过自动配置和注解扫描,Spring Boot Starter Batch 提供了简化和便捷的方式来开发和配置批处理应用程序。它集成了 Spring Batch 的核心功能,并提供了默认的配置,使得开发者可以更专注于业务逻辑的实现。

  1. 自动配置:Spring Boot Starter Batch 提供了自动配置类 BatchAutoConfiguration,它在应用程序启动时自动配置 Spring Batch 相关的组件和属性。它会根据配置文件中的属性来初始化和配置批处理作业的运行环境。

  2. 注解扫描:自动配置类使用 @EnableBatchProcessing 注解来启用批处理功能,并自动扫描作业和步骤的配置类。

  3. JobRepository:自动配置类会创建一个 JobRepository 实例,用于管理作业的元数据和状态。它使用 Spring Batch 提供的默认实现 JobRepositoryFactoryBean,并根据配置文件中的属性进行配置。

  4. 事务管理:自动配置类会创建一个 PlatformTransactionManager 实例,用于管理批处理作业的事务。它使用 Spring Batch 提供的默认实现 DataSourceTransactionManager,并使用配置文件中的数据源进行配置。

  5. 作业执行器:自动配置类会创建一个 JobLauncher 实例,用于启动和执行批处理作业。它使用 Spring Batch 提供的默认实现 SimpleJobLauncher,并使用配置文件中的作业存储库和事务管理器进行配置。
    Spring Boot 3.x版本中SimpleJobLauncher 已经废弃在这里插入图片描述
    需要使用 TaskExecutorJobLauncher.
    在这里插入图片描述

  6. 作业监听器:自动配置类会自动注册配置类中定义的作业监听器(JobListener),以便在作业执行的不同阶段触发相应的事件。

  7. 步骤监听器:自动配置类会自动注册配置类中定义的步骤监听器(StepListener),以便在步骤执行的不同阶段触发相应的事件。

  8. 作业配置类:开发者可以创建作业配置类来定义批处理作业的结构和行为。作业配置类使用 @Configuration 注解标记,并使用 @EnableBatchProcessing 注解启用批处理功能。在作业配置类中,可以定义一个或多个批处理作业,并配置它们的步骤、读取器、处理器、写入器等组件。

  9. 作业执行:通过调用 JobLauncherrun() 方法,并传入作业名称和作业参数,可以启动和执行批处理作业。JobLauncher 会根据作业配置类中的定义,按照步骤的顺序执行作业的各个阶段,并将数据从读取器传递给处理器和写入器。

4.示例项目

从一个包含学生成绩的 CSV 文件中读取数据,并根据一定的条件进行处理和分析。我们简化一下,实际业务肯定比较复杂,我们为了演示,简化一个版本方便大家理解。实现一个批处理任务,从 students.csv 文件中读取学生数据,将分数乘以 10 进行处理,并将处理后的学生数据写入到日志中。

  1. 创建一个名为 Student 的类
@Data
public class Student {private String name;private int score;
}
  1. StudentItemReader 的类,实现 Spring Batch 的 ItemReader 接口,用于从 CSV 文件中读取学生数据。
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.core.io.ClassPathResource;public class StudentItemReader implements ItemReader<Student> {private FlatFileItemReader<Student> reader;public StudentItemReader() {reader = new FlatFileItemReader<>();reader.setResource(new ClassPathResource("students.csv"));DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();tokenizer.setNames("name", "score");BeanWrapperFieldSetMapper<Student> fieldSetMapper = new BeanWrapperFieldSetMapper<>();fieldSetMapper.setTargetType(Student.class);DefaultLineMapper<Student> lineMapper = new DefaultLineMapper<>();lineMapper.setLineTokenizer(tokenizer);lineMapper.setFieldSetMapper(fieldSetMapper);reader.setLineMapper(lineMapper);}@Overridepublic Student read() throws Exception {return reader.read();}
}
  1. 创建一个名为 StudentItemProcessor 的类,实现 Spring Batch 的 ItemProcessor 接口,用于处理学生数据。
import org.springframework.batch.item.ItemProcessor;public class StudentItemProcessor implements ItemProcessor<Student, Student> {@Overridepublic Student process(Student student) throws Exception {// 在这里进行学生数据的处理和分析// 这里只是简单地将分数乘以 10student.setScore(student.getScore() * 10);return student;}
}
  1. 创建一个名为 StudentItemWriter 的类,实现 Spring Batch 的 ItemWriter 接口,用于将处理后的学生数据写入到日志中。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemWriter;public class StudentItemWriter implements ItemWriter<Student> {private static final Logger LOGGER = LoggerFactory.getLogger(StudentItemWriter.class);@Overridepublic void write(List<? extends Student> items) throws Exception {for (Student student : items) {LOGGER.info("Processed student: {}", student);}}
}
  1. 创建一个名为 BatchConfig 的配置类,用于配置批处理作业的相关组件。
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableBatchProcessing
public class BatchConfig {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;// 创建 ItemReader:读取输入数据@Beanpublic ItemReader<Student> itemReader() {return new StudentItemReader();}// 创建 ItemProcessor:处理输入数据@Beanpublic ItemProcessor<Student, Student> itemProcessor() {return new StudentItemProcessor();}// 创建 ItemWriter:写入输出数据@Beanpublic ItemWriter<Student> itemWriter() {return new StudentItemWriter();}// 创建 Step:定义处理步骤@Beanpublic Step step(ItemReader<Student> reader, ItemProcessor<Student, Student> processor,ItemWriter<Student> writer) {return stepBuilderFactory.get("step").<Student, Student>chunk(10).reader(reader).processor(processor).writer(writer).build();}// 创建 Job:定义作业@Beanpublic Job job(Step step) {return jobBuilderFactory.get("job").start(step).build();}
}
  1. 创建一个名为 Application 的启动类,用于启动 Spring Boot 应用和运行批处理作业。
import org.springframework.batch.core.Job;
import org.springframework.batch.core```java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Application {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);// 获取 job beanJob job = context.getBean(Job.class);try {// 启动批处理作业context.getBean(JobLauncher.class).run(job, new JobParameters());} catch (Exception e) {e.printStackTrace();} finally {context.close();}}
}
  1. 创建一个名为 students.csv 的 CSV 文件,包含学生的姓名和分数数据,例如:
姓名分数
张三80
小明75
小花90
大卫85
艾玛92
弗兰克78
格蕾丝88
海伦91
伊万83
爱迪生87

5.总结

使用 Spring Boot Starter Batch,开发者可以更专注于业务逻辑的实现,而不必过多关注底层的配置和管理细节。它提供了一种高效、可靠的方式来处理大规模数据处理任务,为批处理应用程序的开发带来了便利和灵活性。
Spring Boot Starter Batch 是基于 Spring Batch 的开发套件,为批处理应用程序提供了便捷的开发和配置方式。通过自动配置和注解扫描,它简化了批处理作业的搭建和部署过程。

在 Spring Boot Starter Batch 的核心源码中,关键的组件包括自动配置类、作业配置类、JobRepository、事务管理器、作业执行器等。自动配置类负责初始化和配置这些组件,并根据配置文件中的属性进行设置。

开发者可以创建作业配置类,通过定义作业结构和配置步骤、读取器、处理器、写入器等组件来定制批处理作业的行为。作业监听器和步骤监听器可以用来处理作业执行过程中的事件和异常情况。

在这里插入图片描述

大家好,我是冰点,今天的Spring Boot Starter Batch 全部内容就是这些。如果你有疑问或见解可以在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/44166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无涯教程-TensorFlow - TensorBoard可视化

TensorFlow包含一个可视化工具&#xff0c;称为TensorBoard&#xff0c;它用于分析数据流图&#xff0c;还用于了解机器学习模型。 TensorBoard的重要功能包括查看有关垂直对齐的任何图形的参数和详细信息的不同类型统计的视图。 深度神经网络包括多达36&#xff0c;000个节点…

HCIP——VLAN实验2

一.实验要求 1.PC1/3的接口均为access模式&#xff0c;且属于van2&#xff0c;在同一网段 2.PC2/4/5/6的IP地址在同一网段&#xff0c;与PC1/3不在同一网段 3.PC2可以访问4/5/6&#xff0c;PC4不能访问5/6&#xff0c;PC5不能访问PC6 4.所有PC通过DHCP获取ip地址&#xff0c;PC…

《合成孔径雷达成像算法与实现》Figure3.10

代码复现如下&#xff1a; clc clear close all% 参数设置 TBP 100; % 时间带宽积 T 7.2e-6; % 脉冲持续时间 t_0 1e-6; % 脉冲回波时延% 参数计算 B TBP/T; …

unity 之Transform组件(汇总)

文章目录 理论指导结合例子 理论指导 当在Unity中处理3D场景中的游戏对象时&#xff0c;Transform 组件是至关重要的组件之一。它管理了游戏对象的位置、旋转和缩放&#xff0c;并提供了许多方法来操纵和操作这些属性。以下是关于Transform 组件的详细介绍&#xff1a; 位置&a…

C++进阶 特殊类的设计

本篇博客介绍&#xff1a;介绍几种特殊的类 特殊类的设计 设计一个类不能被拷贝设计一个类 只能在堆上创建对象设计一个类 只能在栈上创造对象设计一个类不能被继承单例模式饿汉模式懒汉模式单例模式对象的释放问题 总结 设计一个类不能被拷贝 我们的拷贝只会发生在两个场景当…

利用POM完成脚本分离实现企业级自动化(POM设计模式+页面的框架封装+测试报告截图)

利用POM完成脚本分离实现企业级自动化&#xff08;POM设计模式页面的框架封装测试报告截图&#xff09; 项目-测试-手工测试 项目-测试-手工测试 1.了解需求&#xff1b; 2.编写测试用例&#xff08;开始&#xff09;——功能测试组会去做的事情 3.执行测试用例——发送测试报…

Mac 开发 Tang Nano FPGA 指南(使用终端和使用 VS Code 和插件,适用所有 Gowin FPGA)

最近收到了一个 Tang nano 9K FPGA开发板&#xff0c;就想借此机会研究一下。 官方文档里介绍如果想使用高云的 FPGA&#xff0c;就需要使用 GOWIN IDE&#xff0c;但是需要申请 license 提交一堆资料&#xff0c;我是别人送的就不太方便让别人弄。加上 IDE 其实并不是很适合学…

C#语音播报问题之 无法嵌入互操作类型SpVoiceClass,请改用适用的窗口

C#语音播报问题之 无法嵌入互操作类型SpVoiceClass&#xff0c;请改用适用的窗口 解决办法如下&#xff1a; 只需要将引入的Interop.SpeechLib的属性嵌入互操作类型改为false 改为false 即可解决&#xff01;

SpringCloud新人入门手册

一、SpringBoot流程图 二、创建一个单pom项目改为父子pom项目 0、检查idea是否在父模块pom中生成子模块 <modules><module>eureka</module></modules> 1、子模块pom.xml添加 <dependencies><dependency><groupId>org.springframew…

golang云原生项目之:etcd服务注册与发现

服务注册与发现&#xff1a;ETCD 1直接调包 kitex-contrib&#xff1a; 上面有实现的案例&#xff0c;直接cv。下面是具体的理解 2 相关概念 EtcdResolver: etcd resolver是一种DNS解析器&#xff0c;用于将域名转换为etcd集群中的具体地址&#xff0c;以便应用程序可以与et…

04_15页表缓存(TLB)和巨型页

前言 linux里面每个物理内存(RAM)页的一般大小都是4kb(32位就是4kb),为了使管理虚拟地址数变少 加快从虚拟地址到物理地址的映射 建议配值并使用HugePage巨型页特性 cpu和mmu和页表缓存(TLB)和cache和ram的关系 CPU看到的都是虚拟地址&#xff0c;需要经过MMU的转化&#xf…

ES的索引结构与算法解析

提到ES&#xff0c;大多数爱好者想到的都是搜索引擎&#xff0c;但是明确一点&#xff0c;ES不等同于搜索引擎。不管是谷歌、百度、必应、搜狗为代表的自然语言处理(NLP)、爬虫、网页处理、大数据处理的全文搜索引擎&#xff0c;还是有明确搜索目的的搜索行为&#xff0c;如各大…

使用Scikit-Learn实现多标签分类,助力机器学习

大家好&#xff0c;在机器学习任务中&#xff0c;分类是一种监督学习方法&#xff0c;用于根据输入数据预测标签。例如&#xff0c;我们想要根据历史特征预测某人是否对销售优惠感兴趣&#xff0c;通过使用可用的训练数据训练机器学习模型&#xff0c;可以对输入数据执行分类任…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)八:自定义组件封装上

一、本章内容 本章实现一些自定义组件的封装,包括数据字典组件的封装、下拉列表组件封装、复选框单选框组件封装、单选框组件封装、文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 ![在这里插入图…

Python应用工具-Jupyter Notebook

工具简介 Jupyter Notebook是 基于 网页的用于交互计算的 应用程序&#xff0c;以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运行代码&#xff0c;代码的运行结果也会直接在代码块下 显示&#xff0c;文档是保存为后缀名为 . ipynb 的 JSON 格式文件。 操作指令…

使用Spring Initializr方式构建Spring Boot项目

除了可以使用Maven方式构建Spring Boot项目外&#xff0c;还可以通过Spring Initializr方式快速构建Spring Boot项目。从本质上说&#xff0c;Spring lnitializr是一个Web应用&#xff0c;它提供了一个基本的项目结构&#xff0c;能够帮助我们快速构建一个基础的Spring Boot项目…

【图论】最短路的传送问题

一.分层图问题&#xff08;单源传送&#xff09; &#xff08;1&#xff09;题目 P4568 [JLOI2011] 飞行路线 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) &#xff08;2&#xff09;思路 可知背景就是求最短路问题&#xff0c;但难点是可以使一条路距离缩短至0&#xf…

系统报错mfc100u.dll丢失的解决方法(完美解决dll问题)

系统文件mfc100u.dll丢失和出错&#xff0c;极有可能是盗号木马、流氓软件等恶意程序所导致&#xff0c;其感染相关文件并加载起来&#xff0c;一旦杀毒软件删除被感染的文件&#xff0c;就会导致相关组件缺失&#xff0c;游戏等常用软件运行不起来&#xff0c;且提示“无法启动…

通过爬虫抓取上市企业利润表并在睿思BI中展示

睿思BI从v5.3开始支持网络爬虫&#xff0c;可以从指定URL抓取表格数据&#xff0c;本示例实现从网络上抓取上市企业招商银行的利润表数据&#xff0c;并在睿思BI中进行展现。 首先&#xff1a;从搜狐财经抓取招商银行利润表数据&#xff0c;操作过程如下&#xff1a; 1.在睿思…

迈向通用听觉人工智能!清华电子系、火山语音携手推出认知导向的听觉大语言模型SALMONN

日前&#xff0c;清华大学电子工程系与火山语音团队携手合作&#xff0c;推出认知导向的开源听觉大语言模型SALMONN (Speech Audio Language Music Open Neural Network)。 大语言模型 SALMONN LOGO 相较于仅仅支持语音输入或非语音音频输入的其他大模型&#xff0c;SALMONN对…