Spring Batch的PartitionHandler和Partitioner各是啥作用?

便民服务作者 / 陆丰资讯 / 2026-04-25 22:23
"
关于Spring Batch的PartitionHandler和Partitioner各是啥作用?的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为

关于Spring Batch的PartitionHandler和Partitioner各是啥作用?的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为您带来实质性的帮助。

NSArray *indexPathsForVisibleRows = [detailTableView indexPathsForVisibleRows];

NSMutableSet *sectionSet = [NSMutableSet set];

for ( NSIndexPath *indexPath in indexPathsForVisibleRows ) {

[sectionSet addObject:[NSNumber numberWithInt:indexPath.section]];

}

NSLog(@"sectionSet %@",sectionSet);

// sectionSet {(13, 11, 9, 10, 12 )}

许多批处理问题都可以通过单线程、单进程作业来解决,因此在考虑更复杂的实现之前,最好先检查这些作业是否满足您的需要。衡量一份现实工作的表现,首先看看最简单的实现是否满足您的需求。即使使用标准硬件,您也可以在一分钟内读写数百MB的文件。

Spring Batch提供了一系列选项,本章对此进行了描述,尽管其他地方介绍了一些功能。在较高级别上,有两种并行处理模式:

这些也可分为以下几类:

启动并行处理的最简单方法是将TaskExecutor添加到步骤配置中。

使用java配置时,可以将TaskExecutor添加到步骤中,如下例所示:

只要需要并行化的应用程序逻辑可以划分为不同的职责并分配给各个步骤,那么它就可以在单个进程中并行化。并行步骤执行易于配置和使用。

使用java配置时,与step3并行执行步骤(step1、step2)非常简单,如下例所示:

在远程分块中,步骤处理被分割到多个进程中,通过一些中间件相互通信。下图显示了该模式:

manager组件是单个进程,Worker是多个远程进程。如果管理器不是瓶颈,则此模式效果最好,因此处理的成本必须高于读取项目的成本(在实践中经常如此)。

通过Spring集成,您可以完全控制进程的并发性(例如,通过使用QueueChannel而不是DirectChannel)。此外,通过依赖Spring Integration丰富的通道适配器集合(如JMS和AMQP),您可以将批处理作业的块分发给外部系统进行处理。

具有要远程分块的步骤的简单作业可能具有类似以下配置:

从版本4.1开始,Spring Batch Integration引入了@EnableBatchIntegration注释,可用于简化远程分块设置。此注释提供了两个可以在应用程序上下文中自动连接的bean:

RemoteChunkingManagerStepBuilderFactory:用于配置管理器步骤

RemoteChunkingWorkerBuilder:用于配置远程工作者集成流

这些API负责配置许多组件,如下图所述:

可以看到。Manager需要定义Reader。定义发送的消息通道,定义接收的消息通道。

这里面只定义了reader。好奇发出去的是什么?接收到的又是什么?

在RemoteChunkingManagerStepBuilder#build()中又添加了ChunkMessageChannelItemWriter相当于内部拼接了个完成的step。

那发出去的是啥?

发出去的ChunkRequest

整体流程可以概括如下:

远程分区是通过分区器partitioner来控制整体流程。真正的执行(包含reader这里是一个完整的step功能)不同于远程分块模块。

另一方面,当导致瓶颈的不是项目的处理而是相关的I/O时,远程分区很有用。使用远程分区,可以将工作分配给执行完整的Spring批处理步骤的工作人员。因此,每个worker都有自己的ItemReader、ItemProcessor和ItemWriter。为此,Spring Batch Integration提供了MessageChannelPartitionHandler。

PartitionHandler接口的这个实现使用MessageChannel实例向remote Worker发送指令并接收他们的响应。这为用于与remote Worker通信的传输(如JMS和AMQP例子用的是rabbitmq)提供了一个很好的抽象。

“可伸缩性”一章中涉及远程分区的部分概述了配置远程分区所需的概念和组件,并显示了使用默认TaskExecutionPartitionHandler在单独的本地执行线程中进行分区的示例。对于到多个JVM的远程分区,需要另外两个组件:

与远程分块类似,JMS/AMQP可以用作“远程处理结构”。在这种情况下,使用MessageChannelPartitionHandler实例作为PartitionHandler实现,如上所述。以下示例假定存在一个分区作业,并重点介绍MessageChannelPartitionHandler和JMS/AMQP配置:

可用于简化远程分区设置的@EnableBatchIntegration注释。此注释提供了两个对远程分区有用的bean:

RemotePartitioningManagerStepBuilderFactory:用于配置Manager步骤

RemotePartitioningWorkerStepBuilderFactory:用于配置Worker步骤

这些API负责配置许多组件,如下图所述:(使用db轮询模式)

Remote Partitioning Configuration (with replies aggregation)

在Manager方面,RemotePartitioningManagerStepBuilderFactory允许您通过声明以下内容来配Manager步骤:

无需显式配置MessageChannelPartitionHandler和MessagingTemplate(如果需要,仍然可以显式配置)。

在工作者方面,RemotePartitioningWorkersStepBuilderFactory允许您将工作者配置为:

无需显式配置StepExecutionRequestHandler(如果需要,可以显式配置)。

以下示例显示了如何使用这些API:

关于Spring Batch的PartitionHandler和Partitioner各是啥作用?的探讨就到这里,您是否还有其他想了解的内容?欢迎在评论区留言告诉我们,同时别忘了点击关注哦!

分享到
声明:本文为用户投稿或编译自英文资料,不代表本站观点和立场,转载时请务必注明文章作者和来源,不尊重原创的行为将受到本站的追责;转载稿件或作者投稿可能会经编辑修改或者补充,有异议可投诉至本站。

热文导读