Spring Batch Remote Partitioning(远程分区)简介

本文详述了Spring Batch的远程分区功能,适合有一定Spring Batch基础的读者。介绍了远程分区的重要性和工作原理,强调了官方文档的不足,并提供了一个基于《Spring Batch批处理框架》的示例,讨论了实现远程分区的两种方法,包括官方文档的方法和改进版。通过ActiveMQ作为消息队列,详细解析了Master和Slave的配置,以及如何解决消息队列复用问题,以提高批处理效率。
摘要由CSDN通过智能技术生成

Spring Batch远程分区简介

写此博客的缘由:
题外话:暑假期间实习参与了公司一个SaaS项目,由于是一个新立的项目,因此使用较多的开源框架。在这两个月期间,接触了微服务框架、定时任务调度Quartz、Spring Batch批处理等多个开源框架。由于在某些任务中需要进行批处理作业,使用了Spring batch批处理框架。接触Spring Batch重点学习了Spring Batch Remote Partitioning,完成实现相关功能的Demo。首先,博主本来对java不是太熟悉的,刚来公司的时候连maven都没有用过,更不用说什么微服务、spring框架等,很感谢实习导师教我很多入门的基础,后来自己能够自主学习并参与项目工作。

在学习Spring Batch远程分区的过程中,有一点就是这方面的相关资料或者分享的学习经验很少,最主要的资料就是官方的参考文档,但是参考文档中对Remote Partitioning的介绍也是相当简单,对于初学Spring Batch的人来说很不友好。写这篇博客,总结了自己学习Spring Batch远程分区功能的内容,也希望能够方便大家对Spring Batch远程分区功能有更好的了解。

说明:(1)本博客是针对Spring Batch Remote Partitioning的介绍,读者需要有Spring Batch的基础知识,安装好eclipse、maven、MySQL等;(2)对于想要入门Spring Batch的初学者,推荐阅读刘相的《Spring Batch批处理框架》一书,博客中讲解的例子也是以书中的例子为基础。书中例子的源码地址:https://github.com/jxtaliu/SpringBatchSample 。(3)本文主要关注如何实现远程分区功能,其关键点在于如何通过消息队列实现此功能,具体分区功能请参考《Spring Batch批处理框架》一书。

1. 关于Spring Batch Remote Partitioning

Spring batch是一个轻量级的、完善的批处理框架,对于大数据量和高性能的批处理任务,Spring Batch提供不少高级功能和特性来支持,比如并行step、多线程step、分区step、远程step等功能。其中,远程分区功能是分区step和远程step两者的结合,对于处理大数据量的批处理任务有着重要的作用。这里的远程功能需要使用消息队列接受和发送信息,主要通过Spring Integration实现。所以为了能够了解Remote Partitioning功能,除了Spring Batch,也需要接触到Spring Integration的相关知识。如下面Spring Batch Remote Partitioning的示意图,Master对任务进行分区,把各个分区后的任务交给多个Slave节点执行:
Spring Batch Remote Partitioning

2. 实现Spring Batch Remote Partitioning功能

本节会详细介绍如何配置xml文件实现远程分区功能。这里通过例子详解Spring Batch远程分区功能的实现,以《Spring Batch批处理框架》书中的关于Remote Partitioning的例子为基础。读者们可以从作者的github中下载源代码。

关于书中实现Remote Partitioning的例子不再详细说明,读者有兴趣的话可以尝试运行例子的源代码。但这里需要说明的是,书中的远程分区例子并不完全正确。对于书中例子的配置方法,Master把分区后的任务信息发送到了Slave节点上,Slave收到信息后会执行任务,只是Master不会接收Slave完成任务的信息。所以,当Slave执行任务出错的时候,Master却依旧显示任务completed。

这个例子的远程分区处理如下图所示(来自《Spring Batch批处理框架》书中):

例子远程分区处理示意图

该例子的任务为读取三个文件里的账单记录,并把记录写入数据库中。处理过程为:(1)对任务进行分区,一个文件作为一个分区任务;(2)通过消息队列把文件信息发送给各个Slave节点;(3)Slave收到信息后,处理对应的文件,把记录写入数据库,并返回任务完成的信息;(4)Master收到信息后,结束任务。

所以接下来会给出以不同的方式实现上面远程分区例子,首先是通过官方参考文档的方法实现远程分区,接着会根据我们的需求给出改进的方式实现远程分区。

2.1 通过官网参考文档的方法实现远程分区

官方参考文档地址:https://docs.spring.io/spring-batch/trunk/reference/html/springBatchIntegration.html。参考文档中提供了实现远程分区的方法,但由于该文档写的过于简洁,并且把Master与Slave的配置混在一起,对于初学者来说比较难理解。所以,这里会详细介绍文档的方法,并会清晰地区分Master与Slave的配置,方便用于分别配置为Master、Slave两种不同的程序。

在该例子中,我们使用ActiveMQ作为消息中间件(其它支持jms的MQ都没问题)。读者可以在官网下载ActiveMQ并在本地启动,在 http://localhost:8161/admin 可以观察远程分区发送消息的信息统计。

下图给出了该远程分区方法使用的jms消息队列的示意图:

远程分区jms消息队列示意图

具体的过程如下:
1. 首先,Master对批处理任务job中需要远程分区执行的step进行分区,并将分区后的多条任务消息通过MasterRequestChannel发送到消息中间件的RequestQueue中,并开始监听ReplystQueue;
2. 多个Slave节点相互竞争从RequestQueue获取任务消息,并在收到相应的消息后开始执行任务;
3. Slave完成任务后,把任务完成的信息发送到消息中间件的ReplystQueue中;
4. Master节点收到各个Slave节点完成任务的信息,并把信息放入消息整合器(aggregator)中,统计是否所有分区的任务已经完成,最后判断该step是否成功完成。

为了实现上面的功能,配置文件: job-partition-remote-MasterSlave.xml
将该xml文件保存在《Spring Batch批处理框架》书中的源代码文件夹src\main\resources\ch11\ 中。

(1)修改源代码maven项目pom文件的jar包版本
由于书中源代码使用的版本比较低,为了能够使用新版本的功能,我们需要在pom文件中改为更高的版本。这里的例子使用如下的版本:

<properties>
  <spring.version>4.3.4.RELEASE</spring.version>
  <spring.batch.version>3.0.7.RELEASE</spring.batch.version>    
  <spring.integration.version>4.3.4.RELEASE</spring.integration.version>
</properties>

其中: spring.version、spring.batch.version、spring.integration.version分别表示所有groupId为org.springframework、org.springframework.batch、org.springframework.integration的jar包版本。

(2)配置xml文件中的命名空间

<bean:beans xmlns="http://www.springframework.org/schema/batch"    
    xmlns:bean="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:task="http://www.springframework.org/schema/task"  
    xmlns:int="http://www.springframework.org/schema/integration"
    xmlns:int-jms="http://www.springframework.org/schema/integration/jms" 
    xmlns:jms="http://www.springframework.org/schema/jms"
    xmlns:amq="http://activemq.apache.org/schema/core"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd  
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task.xsd
    http://www.springframework.org/schema/batch 
    http://www.springframework.org/schema/batch/spring-batch.xsd
    http://www.springframework.org/schema/integration 
    http://www.springframework.org/schema/integration/spring-integration-4.3.xsd
    http://www.springframework.org/schema/integration/jms 
    http://www.springframework.org/schema/integration/jms/spring-integration-jms-4.3.xsd
    http://www.springframework.org/schema/jms 
    http://www.springframework.org/schema/jms/spring-jms.xsd
    http://activemq.apache.org/schema/core 
    http://activemq.apache.org/schema/core/activemq-core.xsd">

注意:在命名空间中,spring-integration-jms和spring-integration的xsd文件需要对应于我们在pom文件中配置的版本,否则容易编译错误。

(3)配置连接的ActiveMQ服务器

<amq:connectionFactory id="connectionFactory" brokerURL="tcp://localhost:61616" />

(4)配置xml中的Master部分

  • Master的Job、partitioner与partitionHandler
<job id="partitionRemoteJob">
    <step id="partitionRemoteStep">
        <partition partitioner="partitioner" handler="partitionHandler" />
    </step>
</job>

<bean:bean id="partitioner" 
       class="org.springframework.batch.core.partition.support.MultiResourcePartitioner">
    <bean:property name="keyName" value="fileName"/>
    <bean:property name="resources" value="classpath:/ch11/data/*.csv"/>
</bean:bean>

<bean:bean id="partitionHandler" 
       class="org.springframework.batch.integration.partition.MessageChannelPartitionHandler">
    <bean:property name="messagingOperations">
        <bean:bean class="org.springframework.integration.core.MessagingTemplate">
            <bean:property 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值