00、SpringBatch 4.x.x版本:简单入门

00、SpringBatch批处理

  • 一、介绍
    • 1、什么是批处理?
    • 2、官网
    • 3、优势
    • 4、组织架构
    • 5、程序运行架构图
  • 二、入门案例-H2版(内存)
    • 1、新建项目
    • 2、引入依赖
    • 3、新建HelloJob.java
  • 三、入门案例-MySQL版
    • 1、引入依赖
    • 2、修改 application.yml
    • 3、验证
  • 四、案例解析
    • 1、@EnableBatchProcessing
    • 2、配置数据库四要素
    • 2、创建Tasklet对象
    • 3、创建Step对象
    • 4、创建Job并执行Job

在这里插入图片描述

一、介绍

1、什么是批处理?

定义: 将数据分批次进行处理的过程。
例如: 银行对账文件处理、跨系统数据同步等。
常规批处理步骤: 系统A从数据库中导出数据到文件,系统B读取文件数据并写入到数据库。
在这里插入图片描述
批处理特点:

  • 自动执行: 根据系统设定的工作步骤自动完成
  • 数据量大: 少则百万,多则上千万甚至上亿。如果数据量更大则需要只能用大数据了。
  • 定时执行: 例如,每天、每周、每月执行。

2、官网

官网地址: Overview :: Spring Batch
在这里插入图片描述
根据官网总结如下:

  • Sping Batch 是一个轻量级、完善的批处理框架,帮助企业建立健壮、高效的批处理应用。
  • Sping Batch 是一个基于 Spring 框架为基础的开发的框架,是 Spring 的一个子项目。
  • Sping Batch 提供大量可重用的组件。例如:日志,追踪,事务,任务作业统计,任务重启,跳过,重复,资源管理等等。
  • Spring Batch 是一个 批处理应用框架,不提供调度框架 。如果需要定时处理需要额外引入 调度框架 。例如: Quartz

3、优势

    Spring Batch 框架通过提供丰富的 开箱即用的组件高可靠性高扩展性 的能力。使得开发批处理应用的人员专注于业务处理,提高处理应用的开发能力。

  • 丰富的开箱即用组件

  • 面向Chunk的处理

  • 事务管理能力

  • 元数据管理

  • 易监控的批处理应用

  • 丰富的流程定义

  • 健壮的批处理应用

  • 易扩展的批处理应用

  • 复用企业现有的IT代码

4、组织架构

在这里插入图片描述
Application: 应用层。包含所有的批处理作业,程序员自定义代码实现逻辑。

Batch Core: 核心层。包含 Spring Batch 启动控制 所需要的核心类。例如:JobLauncherJobStep 等。

Batch Infrastructure: 基础架构层。提供通用的 服务处理

三层体系使得 Spring Batch 架构可以在不同层面进行扩展,避免影响,实现高内聚低耦合设计。

5、程序运行架构图

在这里插入图片描述
JobLauncher: 作业调度器。作业启动的主要入口。

Job: 作业。需要执行的任务逻辑。

Step: 作业步骤。一个 Job 作业由1个或者多个 Step 组成。完成所有 Step 操作,一个完整 Job 才算执行结束。

ItemReader: Step 步骤执行过程中数据输入。可以从数据源(文件系统、数据库、队列等)中读取 Item (数据记录)

ItemProcessor: Item 数据加工逻辑(输入)。比如:数据清洗、数据转换、数据过滤、数据校验等。

ItemWriter: Step 步骤执行过程中数据输出。将 Item(数据记录) 写入数据源(文件系统、数据库、队列等)。

JobRepository: 保存Job 或者 检索Job 的信息。 Spring Batch 需要 持久化Job(数据库/内存), JobRepository 就是持久化的接口。

二、入门案例-H2版(内存)

需求: 打印一个 hello spring batch! 不带读/写/处理
H2 是一个嵌入式内存数据库

1、新建项目

新建 Spring Boot 项目:springbatch-demo
本次案例使用环境版本:

# Spring Batch 4.x.x通常匹配Spring Boot 2.x.x
jdk 17
Spring Boot 2.6.15
Spring Batch 4.3.8

此步骤省略~

2、引入依赖

<!-- spring batch -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-batch</artifactId>
</dependency><!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency><!-- H2 -->
<dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope>
</dependency>

3、新建HelloJob.java

package com.ulanhada.springbatchdemo.hello;import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
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.batch.core.launch.JobLauncher;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;import javax.annotation.Resource;@EnableBatchProcessing
public class HelloJob {// job调度器@Resourceprivate JobLauncher jobLauncher;// job构造器工厂@Resourceprivate JobBuilderFactory jobBuilderFactory;// step构造器工厂@Resourceprivate StepBuilderFactory stepBuilderFactory;// 任务-step执行逻辑由tasklet完成@Beanpublic Tasklet tasklet(){return new Tasklet() {@Overridepublic RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception{System.out.println("Hello SpringBatch....");return RepeatStatus.FINISHED;}};}//作业步骤-不带读/写/处理@Beanpublic Step step1(){return stepBuilderFactory.get("step1").tasklet(tasklet()).build();}//定义作业@Beanpublic Job job(){return jobBuilderFactory.get("helloJob").start(step1()).build();}
}

在这里插入图片描述

三、入门案例-MySQL版

1、引入依赖

        <!-- H2 -->
<!--    <dependency>-->
<!--        <groupId>com.h2database</groupId>-->
<!--        <artifactId>h2</artifactId>-->
<!--        <scope>runtime</scope>-->
<!--    </dependency>--><!-- mysql -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version>
</dependency>

2、修改 application.yml

大家根据实际情况修改~

spring:application:name: springbatch-demodatasource:username: rootpassword: 123456url: jdbc:mysql://192.168.250.128:3306/springbatch?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=truedriver-class-name: com.mysql.cj.jdbc.Driver# 初始化数据库,文件在依赖jar包中sql:init:schema-locations: classpath:org/springframework/batch/core/schema-mysql.sqlmode: always# mode: never

⚠️注意:
sql.init.model 首次启动为 always , 后面启动需要改为 never ,否则每次执行SQL都会异常。第一次启动会自动执行指定的脚本,后续不需要再初始化。

3、验证

在这里插入图片描述
在这里插入图片描述

四、案例解析

1、@EnableBatchProcessing

批处理启动注解,要求添加在 配置类 或者 启动类 上。
在这里插入图片描述
添加 @EnableBatchProcessing 注解后,SpringBoot 会自动加载JobLauncherJobBuilderFactoryStepBuilderFactory 类并创建对象交给容器管理。使用时,直接 @Resource 即可。
在这里插入图片描述

2、配置数据库四要素

批处理允许重复执行、异常重试,此时需要保存 批处理状态数据Spring Batch 将数据缓存在 H2 内存中或者缓存在指定 数据库 中。入门案例是保存在 MySQL 中,所以需要配置 数据库四要素
在这里插入图片描述

2、创建Tasklet对象

在这里插入图片描述
Tasklet 负责批处理 Step 步骤中具体业务执行。
Tasklet 是一个接口,有且只有一个 execute 方法 ,用于定制 Step 执行逻辑。
在这里插入图片描述
execute() 方法返回值是一个状态枚举类:RepeatStatus,里面有 可继续执行态已经完成态
在这里插入图片描述

3、创建Step对象

在这里插入图片描述
Job作业 执行实际就是 Step步骤 执行。入门案例选用最简单的 Tasklet 模式,后续再介绍 Chunk块处理 模式。

4、创建Job并执行Job

在这里插入图片描述
创建 Job 对象交给容器管理,当 Spring Boot 启动之后,会自动去从容器中加载 Job 对象。并将 Job 对象交给 JobLauncherApplicationRunner 类,再借助 JobLauncher 类实现 Job 执行。


到这里 00、SpringBatch 4.x.x版本:简单入门 就结束了!!!🎉🎉🎉
后续接 01、SpringBatch 4.x.x版本:作业对象 Job 📣📣📣
欢迎小伙伴们学习和指正!!!😊😊😊
祝大家学习和工作一切顺利!!!😎😎😎

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

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

相关文章

国产桌面操作系统统一身份认证及2FA双因子认证安全升级方案

某金融运营服务公司&#xff0c;主要负责业务处理、客户服务、业务监控、报表统计等金融运营服务&#xff0c;为集团下设二级单位&#xff0c;坐落于一线城市&#xff0c;对政策风向有很高的敏锐度。 该公司已为公司业务人员、客户服务、监督员等配备了数百台国产桌面操作系统…

服务器大请求体问题定位

背景 整个系统,分位微服务A、微服务B,A在调用B的过程中,报400BadRequest,问题定位到修复后,如何发送一个同样的请求进行验证 解决过程 1、查询A服务的日志,发现在调用B的过程中报错400BadRequest,并且请求体非常大300多KB 2、查看B服务的日志,发现请求没有进来 3、发…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 一、简单介绍 二、简单图像浮雕效果实现原理 三、简单图像浮雕效果案例实现简单步骤 四、注…

网络七层模型之会话层:理解网络通信的架构(五)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【豫都故郡·领航新篇】Springer独立出版 |第二届先进无人飞行系统国际会议(ICAUAS 2024)

会议简介 Brief Introduction 2024年第二届先进无人飞行系统国际会议(ICAUAS 2024) 会议时间&#xff1a;2024年6月14日-16日 召开地点&#xff1a;中国南昌 大会官网&#xff1a;ICAUAS 2024-2024 2nd International Conference on Advanced Unmanned Aerial Systems2024 2nd …

【C++】力扣-415-字符串相加(双指针,图例详解!!!)

目录 一、前言 二、字符串相加 三、共勉 一、前言 最近春招已经开始&#xff0c;看周围的同学都在投递一些大厂的实习&#xff0c;某为的手撕代码 --- 字符串相乘&#xff0c;某讯的手撕代码 --- 字符串相减等。 于是专门去 Leetcode 上搜索了一下&#xff0c;发现这类题目是面…

conda使用记录

linux 使用conda创建新一个新的python环境过程 conda create -n recommendation_env python3.8.18 # 指定python版本 conda env list # 查看所有的环境 conda activate recommendation_env # 激活创建的新环境 pip install flask # 安装依赖 或者 pip install flask版本号 或者…

每日更新5个Python小技能 | 第六期

大家好&#xff01;欢迎阅读每日更新的Python小技能系列&#xff0c;今天是第六期。在这个系列中&#xff0c;我将每天分享5个高级的Python小技巧&#xff0c;帮助大家进一步提升编程技能。让我们开始吧&#xff01; 1. 元类&#xff08;Metaclasses&#xff09; 元类是Pytho…

脑机交互,屏幕是必须?No!让机器人发出激光光点实现脑机接口交互

一般说来&#xff0c;传统脑机接口(BCI)系统的交互过程依靠一个图形化的用户界面&#xff0c;不利于设备的便携性。而一种无屏幕的BCI可以通过让机器人在外界环境中发出刺激从而实现更直接的命令其中机器人使用激光光点凸显环境中的候选对象&#xff0c;而用户的目标则从脑电图…

跳跃游戏-java

题目描述: 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题思想: …

正则表达式爬取页面图片(<img[^>]*src=“([^“]+))

import re import os import requests if __name__ __main__:# 创建一个文件夹&#xff0c;保存所有的图片if not os.path.exists(./##):os.mkdir(./##)# - 指定urlurl *******headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like …

AIGC新潮流!手势灵动数字人视频、百变模特服装图、3D模型纹理一键生成

1、营销应用:AI生成生成带手势(手部动作)的数字人视频 (1)一个基于扩散模型的数字人生成框架,专注于生成具有全身动作的主播风格视频。该系统通过仅需一分钟的个人视频片段进行训练,便能自动生成具有精确躯干和手部动作的主播风格视频。 (2)定位:该框架定位于解决现…

docker环境配置过程中的常见问题

1、pull镜像问题 docker pull jenkins/jenkins:lts Using default tag: latest Trying to pull repository docker.io/library/centos ... Get https://registry-1.docker.io/v2/library/centos/manifests/latest: Get https://auth.docker.io/token?scoperepository%3Alibr…

自动驾驶-如何进行多传感器的融合

自动驾驶-如何进行多传感器的融合 附赠自动驾驶学习资料和量产经验&#xff1a;链接 引言 自动驾驶中主要使用的感知传感器是摄像头和激光雷达&#xff0c;这两种模态的数据都可以进行目标检测和语义分割并用于自动驾驶中&#xff0c;但是如果只使用单一的传感器进行上述工作…

数据处理库Pandas数据结构DataFrame

Dataframe是一种二维数据结构&#xff0c;数据以表格形式&#xff08;与Excel类似&#xff09;存储&#xff0c;有对应的行和列&#xff0c;如图3-3所示。它的每列可以是不同的值类型&#xff08;不像 ndarray 只能有一个 dtype&#xff09;。基本上可以把 DataFrame 看成是共享…

【机器学习之---数学】熵和交叉熵

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 熵和交叉熵 1. 熵 概率分布的熵可以被解释为与给定分布中的随机变量相关的不确定性或缺乏可预测性的度量。 我们还可以使用熵来定义数据源的信息内容。…

小程序UI设计规范,界面设计尺寸详解

作为互联网技术的重要组成部分&#xff0c;小程序在日常生活中发挥着越来越重要的作用。因此&#xff0c;了解和严格遵守小程序的 UI 设计标准非常重要&#xff0c;它不仅可以帮助我们在保证良好用户体验的同时优化小程序&#xff0c;还可以使我们的产品在竞争激烈的市场中占据…

蓝桥杯2023年第十四届省赛真题-飞机降落

蓝桥杯2023年第十四届省赛真题-飞机降落 - C语言网 (dotcpp.com) “蓝桥杯前一周才开始写真题&#xff0c;练算法&#xff0c;能赢嘛&#xff1f;会赢的&#xff08;bushi五条&#xff09;” 题目描述 N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻到…

JAVA学习-网络编程.Java11标准化的HTTP Client

Java 11引入了标准化的HTTP Client&#xff0c;它提供了一种现代化、灵活且易于使用的方式来进行HTTP通信。下面是关于Java 11标准化的HTTP Client的概述以及与其他比较和高级应用的说明&#xff1a; 1. 概述&#xff1a; Java 11标准化的HTTP Client是一种替代HttpURLConnect…

git:开发中可能遇到的问题:拉取远程分支相关(有远程仓库但是没有远程分支或者fatal: bad revision ‘origin/master‘)

远程分支相关 有远程仓库但是没有远程分支&#xff08;git fetch&#xff09; shanshanEVYSHAN-MC0 bk_template_ieod % git remote -v origin gitxxxx.git (fetch) origi…