热门标签 | 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 多线程是怎么实现的。



推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
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社区 版权所有