Spring Batch批量处理数据

Spring Batch 是一个由 Pivotal Software(原 SpringSource,现属于 VMware)开发的批处理框架,它是 Spring 框架的一部分,主要用于创建高效、健壮的批量数据处理应用。Spring Batch 设计用于处理大量的记录,例如在夜间处理或定期运行的数据加载、转换和整合操作。

Spring Batch 的主要特性包括:

  1. 事务管理:支持事务边界内的数据处理,确保数据完整性。
  2. 并发处理:允许并行处理数据,提高处理速度。
  3. 重试机制:当出现故障时,可以配置重试策略以重新处理失败的记录。
  4. 跳过机制:能够跳过某些失败的记录而不中断整个批处理作业。
  5. 持久化状态管理:使用 JobRepository 来跟踪作业的状态,即使在系统重启后也能恢复作业。
  6. 分片/分区:可以将数据集分割成小块,并在多个处理器上并行处理。
  7. 远程执行:支持跨机器的作业执行。
  8. 监控和日志:提供详细的日志记录和作业执行的监控能力。

Spring Batch 的架构包括以下几个核心组件:

  • Job:这是批处理作业的最高级别抽象,可以包含一个或多个步骤。
  • Step:是批处理作业中的一个逻辑单元,可以是任务步骤(如读取、处理、写入数据)或决策步骤。
  • ItemReader:负责从数据源读取数据项。
  • ItemProcessor:对读取的数据项进行处理。
  • ItemWriter:将处理后的数据写入目标数据源。
  • JobLauncher:负责启动和执行作业。
  • JobRepository:管理作业的元数据和状态,通常与数据库交互。

Spring Batch 不是一个调度框架,它专注于批处理作业的实现细节,通常需要与其他调度框架(如 Quartz 或 Cron)结合使用,以便控制作业何时启动。由于其高度的可配置性和灵活性,Spring Batch 成为了企业级批处理应用的首选框架之一。

在Spring Boot项目中集成Spring Batch涉及几个关键步骤,下面举个例子,说明如何设置一个基本的Spring Batch环境:

1. 添加依赖

首先,在pom.xml文件中添加Spring Batch和Spring Boot Starter Batch的依赖:

<dependencies><!-- Spring Batch --><dependency><groupId>org.springframework.batch</groupId><artifactId>spring-batch-core</artifactId><version>4.x.y.RELEASE</version> <!-- 使用最新稳定版 --></dependency><!-- Spring Boot Starter Batch --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId></dependency><!-- 数据库连接池 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- 数据库驱动 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- 如果使用H2作为内存数据库 --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId></dependency>
</dependencies>

2. 配置数据源和JobRepository

Spring Batch需要一个数据源来存储作业元数据和状态。这通常通过application.propertiesapplication.yml文件配置:

spring.datasource.url=jdbc:mysql://localhost:3306/batchdb
spring.datasource.username=batchuser
spring.datasource.password=batchpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# Spring Batch配置
spring.batch.job.enabled=false # 设置为false,避免在启动时自动执行任何job

3. 创建Job和Step

定义一个Job,并为其创建一个或多个Step。这通常通过一个@Configuration类和@EnableBatchProcessing注解完成:

@Configuration
@EnableBatchProcessing
public class BatchConfig {@Autowiredprivate JobBuilderFactory jobBuilderFactory;@Autowiredprivate StepBuilderFactory stepBuilderFactory;@Beanpublic Job importUserJob() {return jobBuilderFactory.get("importUserJob").incrementer(new RunIdIncrementer()).flow(importUserDataStep()).end().build();}@Beanpublic Step importUserDataStep() {return stepBuilderFactory.get("importUserDataStep").<User, User>chunk(10).reader(userItemReader(null)).processor(userItemProcessor()).writer(userItemWriter()).build();}
}

4. 实现ItemReader, ItemProcessor, 和 ItemWriter

在上面的示例中,importUserDataStep()使用chunk-oriented步骤,这意味着它将数据分批处理。你需要实现ItemReader, ItemProcessor, 和 ItemWriter来分别读取、处理和写入数据:

@Bean
public FlatFileItemReader<User> userItemReader(Resource resource) {DefaultLineMapper<User> lineMapper = new DefaultLineMapper<>();DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();tokenizer.setNames("firstName", "lastName");BeanWrapperFieldSetMapper<User> fieldSetMapper = new BeanWrapperFieldSetMapper<>();fieldSetMapper.setTargetType(User.class);lineMapper.setLineTokenizer(tokenizer);lineMapper.setFieldSetMapper(fieldSetMapper);FlatFileItemReader<User> itemReader = new FlatFileItemReader<>();itemReader.setResource(resource);itemReader.setLinesToSkip(1); // 跳过标题行itemReader.setLineMapper(lineMapper);return itemReader;
}@Bean
public ItemProcessor<User, User> userItemProcessor() {return new ItemProcessor<User, User>() {@Overridepublic User process(User item) throws Exception {item.setFirstName(item.getFirstName().toUpperCase());return item;}};
}@Bean
public JpaPagingItemWriter<User> userItemWriter(JpaItemWriterBuilder<User> builder) {return builder.entityManagerFactory(entityManagerFactory).build();
}

5. 启动Job

在你的主类中,你可以注入JobLauncherJob,然后调用它们来启动作业:

@Autowired
private JobLauncher jobLauncher;@Autowired
private Job importUserJob;// 在适当的地方调用
jobLauncher.run(importUserJob, new JobParametersBuilder().addLong("time", System.currentTimeMillis()).toJobParameters());

以上步骤会帮助你在一个Spring Boot项目中集成Spring Batch。请注意,实际的配置可能需要根据你的具体需求和环境进行调整。

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

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

相关文章

PreparedStatement 与Statement 的区别,以及为什么推荐使用 PreparedStatement ?

在Java中&#xff0c;PreparedStatement和Statement都是用于执行SQL语句的重要接口&#xff0c;但它们在功能、安全性和性能上有着显著的差异。理解这些差异对于编写高效且安全的数据库应用程序至关重要。 Statement&#xff1a;基本的SQL执行者 首先&#xff0c;让我们从Sta…

[物联网专题] - 螺钉式接线端子的选择和辨识

工业设备上大量使用各式各样的端子来连接外部设备和电缆电线&#xff0c;其中用得最多的就是标准的螺钉式端子&#xff0c;其外形如下&#xff1a; 标准端子一般是2位&#xff08;2个接线端子&#xff09;&#xff0c;端子与端子之间可以级联&#xff0c;组成任意数量的位数。…

【前端】简易化看板

【前端】简易化看板 项目简介 看板分为三个模块&#xff0c;分别是待办&#xff0c;正在做&#xff0c;已做完三个部分。每个事件采取"卡片"式设计&#xff0c;支持任务间拖拽&#xff0c;删除等操作。 代码 import React, { useState } from react; import { Car…

【图论 树 深度优先搜索】2246. 相邻字符不同的最长路径

本文涉及知识点 图论 树 图论知识汇总 深度优先搜索汇总 LeetCode 2246. 相邻字符不同的最长路径 给你一棵 树&#xff08;即一个连通、无向、无环图&#xff09;&#xff0c;根节点是节点 0 &#xff0c;这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度…

如何正视AI创造音乐

音乐作为一种艺术形式&#xff0c;一直被认为是人类情感和创造力的表达。然而&#xff0c;随着人工智能技术的快速发展&#xff0c;AI在音乐领域的应用也日益广泛。最近一个月&#xff0c;音乐大模型的轮番上线&#xff0c;将素人生产音乐的门槛降到了最低&#xff0c;引发了音…

【漏洞复现】SolarWinds——任意文件读取

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 SolarWinds其Serv-UFTP服务存在目录遍历导致任意文件读取漏洞&a…

数据访问层如何提取数据到其他层,其他类中

当然可以&#xff0c;以下是一些具体的例子&#xff0c;展示了如何将数据库访问逻辑封装在一个单独的类中&#xff0c;并在其他类中使用这个类来获取数据。 数据库访问类&#xff08;DatabaseAccess.java&#xff09;&#xff1a; java复制代码 import java.sql.*; import ja…

自然语言处理(NLP)—— 深度学习

1. 词嵌入&#xff08;Embeddings&#xff09; 1.1 词嵌入的基本概念 词嵌入&#xff08;Embeddings&#xff09;是一种将词语映射到高维空间&#xff08;比如N300维&#xff09;的技术&#xff0c;使得词语之间的欧几里得距离与它们的语义距离相关联。这意味着在这个向量空间…

macOS 上或linux安装 Jenkins

在 macOS 上使用 Docker 安装 Jenkins 的步骤如下&#xff1a; 安装 Docker: 如果尚未安装 Docker&#xff0c;请先从 Docker 官网下载并安装 Docker Desktop for Mac。 打开终端: 打开 macOS 上的终端应用程序。 拉取 Jenkins 镜像: 使用以下命令从 Docker Hub 拉取 Jenkins…

Golang | Leetcode Golang题解之第203题移除链表元素

题目&#xff1a; 题解&#xff1a; func removeElements(head *ListNode, val int) *ListNode {dummyHead : &ListNode{Next: head}for tmp : dummyHead; tmp.Next ! nil; {if tmp.Next.Val val {tmp.Next tmp.Next.Next} else {tmp tmp.Next}}return dummyHead.Next …

Python测试框架 pytest : 从零开始的完全指南

pytest : 从零开始的完全指南 一、pytest 简介1.1 pytest 的背景和发展历史1.2 pytest 的概念1.3 pytest 的特点1.4 测试阶段分类1.5 单元测试框架的主要功能 二、pytest 的基本使用2.1 pytest 默认测试用例2.2 全局配置文件 pytest.ini2.3 执行 pytest2.4 跳过方法2.5 pytest …

1.SQL注入-数字型

SQL注入-数字型(post) 查询1的时候发现url后面的链接没有传入1的参数。验证为post请求方式&#xff0c;仅显示用户和邮箱 通过图中的显示的字段&#xff0c;我们可以猜测传入数据库里面的语句&#xff0c;例如&#xff1a; select 字段1,字段2 from 表名 where id1; 编辑一个…

深入解析 Apache Kylin 数据更新机制:保持大数据活力的策略

Apache Kylin 是一个开源的分布式分析引擎&#xff0c;专为大规模数据集的快速分析而设计。它通过预计算技术&#xff0c;将查询结果存储在 HBase 或其他 NoSQL 数据库中&#xff0c;从而加快查询速度。然而&#xff0c;数据是动态变化的&#xff0c;这就要求 Kylin 具备有效的…

外星球的公理与地球的公理

公理是指依据人类理性的不证自明的基本事实&#xff0c;经过人类长期反复实践的考验&#xff0c;不需要再证明的基本命题。然而&#xff0c;人类目前的科学技术水平有限&#xff0c;还未能证明和观测到地外星球的存在&#xff0c;因此无法得知外星球的公理。 比如在地球上&…

ShardingSphere初探(二)

ShardingSphere初探&#xff08;二&#xff09; 广播表 广播表是指在分布式数据库系统中&#xff0c;每个数据节点上都拥有其完整副本的表。无论查询操作在哪个节点上执行&#xff0c;广播表的数据在所有节点上都是一致的。 演示 表创建,分别在库1和库2创建t_dict表 CREAT…

使用 mindspore 的常见的 Tensor 的用法

1. 背景&#xff1a; 使用 mindspore 学习神经网络&#xff0c;打卡第二天&#xff1b; 2. 训练的内容&#xff1a; 使用 mindspore 的常见的 Tensor 的用法&#xff1b; 3. 常见的用法小节&#xff1a; Tensor 构造; 初始化; 继承属性(ones_like); 属性 - 同 numpy; 索引…

SOAP vs REST介绍

SOAP&#xff08;简单对象访问协议&#xff09; 定义&#xff1a;SOAP是一种基于XML的通信协议&#xff0c;用于在网络中交换结构化信息&#xff0c;特别是在分布式环境和需要中介&#xff08;如网关或防火墙&#xff09;的环境中。它通过HTTP、SMTP等多种传输协议传输信息&…

示例:WPF中推荐一个Diagram开源流程图控件

一、目的&#xff1a;分享一个自研的开源流程图控件 二、使用方法 1、引用Nuget包&#xff1a; 2、添加节点列表和绘图控件 <DockPanel><ItemsControl DockPanel.Dock"Left"><h:GeometryNodeData Text"节点"/></ItemsControl><…

代码随想三刷贪心篇4

代码随想三刷贪心篇4 452. 用最少数量的箭引爆气球题目代码435. 无重叠区间题目代码763. 划分字母区间题目代码56. 合并区间题目代码452. 用最少数量的箭引爆气球 题目 链接 代码 class Solution {public int findMinArrowShots(int[][] points) {Arrays.

Android Style 使用指南

简介: Android Style 是一种能够统一定义应用程序中视图元素外观和行为的强大工具。通过使用 Style&#xff0c;可以轻松地应用相同的样式属性到多个视图上&#xff0c;提高代码的可维护性和重用性。本文将介绍 Android Style 的基本概念、使用方法以及一些最佳实践&#xff0c…