Spring Batch | quick start

在这里插入图片描述

导学

官网介绍:https://docs.spring.io/spring-batch/reference/spring-batch-intro.html
批处理就是将数据分批次进行处理的过程。
常规的批处理操作步骤:系统A从数据库中导出数据到文件,系统B读取文件数据并写入到数据库
批处理特点:

  • 自动执行,根据系统设定的工作步骤自动完成
  • 数据量大,少则百万,多则上千万甚至上亿。(如果是10亿,100亿那只能上大数据了)
  • 定时执行,比如:每天,每周,每月执行。
使用场景

典型的批处理程序通常:

  • 从数据库、文件或队列中读取大量记录。
  • 以某种方式处理数据。
  • 以修改后的形式写回数据。

Spring Batch 自动化了这个基本的批处理迭代,提供了将类似事务作为一个集合进行处理的能力,通常是在离线环境中,无需任何用户交互。批处理作业是大多数 IT 项目的一部分,Spring Batch 是唯一提供强大的企业级解决方案的开源框架。

业务场景

Spring Batch支持以下业务场景:

  • 定期提交批处理过程。
  • 并行批处理:对作业进行并行处理。
  • 分阶段、企业消息驱动的处理。
  • 大规模并行批处理。
  • 故障后手动或计划重新启动。
  • 相关步骤的顺序处理(扩展到工作流驱动的批处理)。
  • 部分处理:跳过记录(例如,在回滚时)。
  • 整个批处理事务,适用于具有小批量大小或现有存储过程或脚本的情况。

quick start - 内存版

需求:打印一个Hello Spring Batch!不带读、写和处理。

  1. 创建一个干净的maven项目
  2. 在pom.xml中添加以下依赖:
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- 内存版 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  1. 创建一个Spring Boot启动类:
@SpringBootApplication
// 加上@EnableBatchProcessing注解后,SpringBoot会自动加载 JobLauncher JobBuilderFactory StepBuilderFactory 类并创建对象交给容器管理,要使用时,直接注入即可
@EnableBatchProcessing
public class SpringBatchApplication {
    public static void main(String[] args) {
        org.springframework.boot.SpringApplication.run(SpringBatchApplication.class, args);
    }
}
  1. 定义一个任务:
@Configuration
public class QuickStartH2 {

    // job调度器
    @Autowired
    private JobLauncher jobLauncher;

    // job构造器工厂
    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    // step构造器工厂
    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    /**
     * 任务: step执行逻辑由tasklet实现
     * @return
     */
    @Bean
    public Tasklet tasklet() {
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello Spring Batch!");
                return RepeatStatus.FINISHED;
            }
        };
    }

    /**
     * step: 执行逻辑(作业步骤)
     * @return
     */
    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .tasklet(tasklet())
                .build();
    }

    /**
     * job: 任务
     * @return
     */
    @Bean
    public Job job() {
        return jobBuilderFactory.get("job-h2")
                .start(step1())
                .build();
    }
}

批处理允许重复执行,异常重试,此时需要保存批处理状态与数据,Spring Batch 将数据缓存在H2内存中或者缓存在指定数据库中。

  1. 启动项目:

image.png

quick start - MySQL版

  1. 创建spring_batch数据库:

image.png

  1. 将pom.xml中的h2依赖注释掉
  2. application.yml文件配置数据库连接和初始化SQL脚本

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

spring:
  datasource:
    username: root
    password: admin
    url: jdbc:mysql://127.0.0.1:3309/spring_batch?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
  # 初始化数据库,sql脚本在依赖jar中
  sql:
    init:
      mode: always
      schema-locations: classpath:org/springframework/batch/core/schema-mysql.sql
#      mode: never
  1. 定义一个任务:
@Configuration
public class QuickStartMySql {

    // job调度器
    @Autowired
    private JobLauncher jobLauncher;

    // job构造器工厂
    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    // step构造器工厂
    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    /**
     * 任务: step执行逻辑由tasklet实现
     * @return
     */
    @Bean
    public Tasklet tasklet() {
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello Spring Batch!");
                return RepeatStatus.FINISHED;
            }
        };
    }

    /**
     * step: 执行逻辑(作业步骤)
     * @return
     */
    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .tasklet(tasklet())
                .build();
    }

    /**
     * job: 任务
     * @return
     */
    @Bean
    public Job job() {
        return jobBuilderFactory.get("job-MySQL")
                .start(step1())
                .build();
    }
}
  1. 启动项目:

image.png

  1. 数据库:

image.png
image.png

github笔记

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab 最小二乘拟合圆柱

目录 一、算法原理1、算法简介2、参考文献二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法简介 圆柱拟合步骤主要包括两步: 一是确定柱面模型参数初始值; 二是…

粤嵌6818开发板如何理解Linux文件IO?

一、文件IO的概述 1、什么是文件&#xff1f; Linux下一切皆文件。普通文件、目录文件、管道文件、套接字文件、链接文件、字符设备文件、块设备文件。 2、什么是IO&#xff1f; input output&#xff1a;输入输出 3、什么是文件IO&#xff1f; 对文件的输入输出&#xff0c;把…

鸿蒙一次开发,多端部署(五)页面开发的一多能力介绍

本章介绍如何使用方舟开发框架“一多”能力&#xff0c;开发出在多设备上正常显示的页面。方舟开发框架推荐开发者使用声明式开发范式开发应用&#xff0c;故本章的内容和示例都主要基于声明式开发范式。本章主要包含如下内容&#xff1a; 布局能力 布局决定了页面中的元素按照…

【Git】恢复被 git checkout -- . 重置掉的代码(或未commit的代码)

文章目录 有时候大家在工作区的代码未提交被重置了&#xff0c;然后又没有commit记录&#xff0c;这时候就可以尝试下面这种方法找回。 在 vscode 中&#xff0c;先打开被重置的文件点击该文件的本地时间线&#xff0c;就可以在 vscode 中看到该文件的本地记录 这里可以找到工作…

ai写作助手,破解写作遇到的难题

在写作过程中&#xff0c;有些人会遇到不同写作的难题&#xff0c;没写作灵感写不出文章&#xff0c;文笔差不会写文章&#xff0c;没有时间去写文章等等&#xff0c;然而把这些问题放在一个ai写作助手面前来说&#xff0c;却不成问题&#xff0c;那是因为ai写作助手它具备强大…

OR-6N137高速隔离运放光耦,对标6N137等

高效率的AlGaAs LED和高速光学探测器组成 拥有交流和直流隔离 改善了传统光电晶体管耦合器的速度 共模瞬态抗扰度 特征 VCM1000V&#xff0c;瞬时共模抑制&#xff1a;10KV/μsec 宽工作温度范围 -40~85C 高输入输出隔离电压 &#xff08; Viso 5000Vrms &#xff09; …

Spring MVC(二)-过滤器与拦截器

过滤器和拦截器在职责和使用场景上存在一些差异。 过滤器 拦截器 作用 对请求进行预处理和后处理。例如过滤请求参数、设置字符编码。 拦截用户请求并进行相应处理。例如权限验证、用户登陆检查等。 工作级别 Servlet容器级别&#xff0c;是Tomcat服务器创建的对象。可以…

Docker 中 Nginx 反向代理

本文主角&#xff1a;Nginx Proxy Manager 。 使用docker安装Nginx Proxy Manager。 1、找到C:\Windows\System32\drivers\etc下的hosts文件&#xff0c;添加 “域名 IP"即可。 使用vscode编辑文件&#xff0c;保存时会提示用管理员权限保存即可。 2、Nginx Proxy Mana…

AD实用设置教程

一、“ 多边形敷铜 ” 设置 “ 最小间隔 ” 在AD9中设置多边形敷铜的间距&#xff0c;可以按照以下步骤进行&#xff1a; 打开一个PCB文件&#xff0c;在PCB工程界面选择“设计”->“规则”->“Electrical”->“Clearance”。在“Clearance”上右键选择“新建规则”…

C语言刷题1

和黛玉学编程呀 这期就是普普通通题目和答案啦&#xff0c;大都也比较基础&#xff0c;适合初学者&#xff0c;下期我们就更单链表啦 求Snaaaaaaaaaaaaaaa的前5项之和&#xff0c;其中a是一个数字&#xff0c; 例如&#xff1a;222222222222222 int main() {int a 0;int n …

安装调试kotti_ai:AI+互联网企业级部署应用软件包@riscv+OpenKylin

先上结论&#xff1a;riscvOpenKylin可以安装pyramidkottikotti_ai 但是paddle_serving_client无法安装&#xff0c;项目的AI实现部分需要改用其它方法&#xff0c;比如onnx。最终onnx也没有装成&#xff0c;只好用飞桨自己的推理。 安装kotti pip install kotti 安装kotti和…

多人命题系统|基于SSM框架+ Mysql+Java+ B/S结构的多人命题系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

JavaSE:数据类型与变量

目录 一、前言 二、数据类型与变量 &#xff08;一&#xff09;字面常量 &#xff08;二&#xff09;数据类型 &#xff08;三&#xff09;变量 1.变量概念 2.语法格式 3.整型变量 3.1整型变量 3.2长整型变量 3.3短整型变量 3.4字节型变量 4.浮点型变量 4.1双精…

谷歌DeepMind推出SIMA智能体,可以跟人一起玩游戏

谷歌 DeepMind 推出了 SIMA&#xff0c;这是一种通过训练学习游戏技能的人工智能代理&#xff0c;因此它玩起来更像人类&#xff0c;而不是一个只做自己事情的强大人工智能。 从早期与 Atari 游戏合作&#xff0c;到以人类大师级别玩《星际争霸 II》的 AlphaStar 系统&#xf…

PyGWalker:Python中的Tableau,数据可视化变得如此简单!

文章目录 1介绍2 安装3 使用4 将数据可视化导出为代码5 总结 1介绍 在数据分析和可视化的领域&#xff0c;Tableau凭借其强大的功能和直观的界面&#xff0c;一直以来都是专业人士的首选工具。然而&#xff0c;对于许多用户而言&#xff0c;Tableau的封闭性和高昂的成本使其难…

leetcode刷题(javaScript)——BFS广度优先遍历相关场景题总结

广度优先搜索&#xff08;BFS&#xff09;在JavaScript编程中有许多实际应用场景&#xff0c;特别是在解决图、树等数据结构相关问题时非常常见。在JavaScript中&#xff0c;可以使用队列来实现广度优先搜索算法。通过将起始节点加入队列&#xff0c;然后迭代地将节点的邻居节点…

60 个深度学习教程:包含论文、实现和注释 | 开源日报 No.202

labmlai/annotated_deep_learning_paper_implementations Stars: 44.0k License: MIT annotated_deep_learning_paper_implementations 是一个包含深度学习论文的 60 个实现/教程&#xff0c;附带并排注释&#xff1b;包括 transformers&#xff08;原始、xl、switch、feedbac…

2023年五级区划省市县乡镇行政村社区边界数据

行政区划数据是重要的基础地理信息数据&#xff0c;根据国家统计局公布的数据&#xff0c;行政区划共分为五级&#xff0c;分别为省级、地级、县级、乡镇/街道级、村/社区级。 该套数据以2020-2023年国家基础地理信息数据中的县区划数据作为矢量基础&#xff0c;辅以高德行政区…

Leetcode 19. 删除链表的倒数第 N 个结点

题目描述&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xf…

图论中的最小生成树:Kruskal与Prim算法深入解析

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;アンビバレント—Uru 0:24━━━━━━️&#x1f49f;──────── 4:02 &#x1f504; ◀️ ⏸ ▶️ ☰ …