热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBatch中多线程配置及实现例子

本文介绍了在SpringBatch中开启多线程的配置方法,包括设置线程数目和使用线程池。通过一个示例演示了如何实现多线程从数据库读取数据并输出。同时提到了在多线程情况下需要考虑Reader的线程安全问题,并提供了解决方法。
1dd71110784aed2987c0ecc9cda3cf09.png

在Spring Batch 中开启多线程需要两个两个值:

  • throttleLimit:线程数(最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目)
  • taskExecutor:如果是多线程,需要将这个参数设置成线程池,默认是一个简单异步执行器

现在我们开始今天的Demo, 这个Demo实现一个SB功能,就是多线程从数据库读出来数据,然后在Writer答应出读出的对象。

话不多说,先创建一个Spring -Batch的工程(SpringBatch从入门到放弃001- HelloWorld)。

配置一个Reader,我们选用JdbcPagingItemReader,这里需要注意的是对于多线程Batch,需要考虑Reader的线程安全问题,因为在多线程情况下,会导致Reader中的 如果你还不知道那些Reader 实现线程安全的,可以参考另一文章:SpringBatch从入门到放弃006- ItemReader

94db8e4f5ecb31444a5d84d3206c1c80.png



其实实现Reader线程安全问题非常简单,我们打开JdbcPagingItemReader的源码,在Javadoc 里面是这样描述:这是一个线程安全的实现在调用open()方法之间,如果在多线程中使用,需要设置saveState=false(但是这样就会不支持重启)。

d80a8246bfd2af7c5e53b7e1d72a2b66.png



那么他是如何线程安全的呢?,继续看源码,在AbstractPagingItemReader.doRead()方法中我们看到了synchronized,这里是不是恍然大悟?

474fbfe62eb3b1112c8234a7962d91fa.png



Processor 没有要求是线程安全的,所以定义成普通的就好了, Writer 要求线程安全,但是我们需求不需要线程安全,所以也定义成常规的就好了。

ff97189412c7d7a0978868af8bf297f4.png



核心的配置来了,我们首先定义了一个线程池ThreadPoolTaskExecutor,然后将这个任务执行线程池定义到Step中去,在给step 设置throttleLimit 设置成5。这样就实现了多线程。

b5cbc08394704aceea8b327b65885520.png



我们注意到reader是分页读,每次读取3个元素,chunkSize 是 5 ,代表每五次写一次,那么Reader/Processor/Writer 是怎么匹配执行的呢?这里先卖个关子后边的章节我们会说到。

定义一个Junit,查看运行结果。

a8d0eb15e50dae159b4fb4696b703c14.png



我们可以看到多个线程在执行Job。

2ad1b4b16ebf80385234eeb4e9a2d1f5.png



这一节只是简单介绍一个Spring Batch 多线程的配置,下个章节鹏哥将通过源码,像大家展示,Spring Batch 多线程是怎么实现的。



推荐阅读
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
author-avatar
usually111131
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有