Java Spring批处理中的网格大小
我有一个批处理作业,它从大容量文件中读取数据,处理数据并插入数据库 我正在使用spring的分区特性,使用默认的分区处理程序Java Spring批处理中的网格大小,java,spring,spring-batch,Java,Spring,Spring Batch,我有一个批处理作业,它从大容量文件中读取数据,处理数据并插入数据库 我正在使用spring的分区特性,使用默认的分区处理程序 <bean class="org.spr...TaskExecutorPartitionHandler"> <property name="taskExecutor" ref="taskExecutor"/> <property name="step" ref="readFromFile" /&
<bean class="org.spr...TaskExecutorPartitionHandler">
<property name="taskExecutor" ref="taskExecutor"/>
<property name="step" ref="readFromFile" />
<property name="gridSize" value="10" />
</bean>
这里的gridSize
的意义是什么?我的配置方式与taskExecutor中的并发性相同。根据API
传递到中的StepExecutionSplitter
句柄(StepExecutionSplitter,StepExecution)方法,指示它
理想情况下,需要多少StepExecution实例。这个
在这种情况下,允许StepExecutionSplitter忽略网格大小
由于必须保留输入数据分区,因此需要重新启动
gridSize
指定要创建的数据块的数量,以便(通常)由相同数量的工作者处理。将其视为map/reduce中的许多映射数据块
使用StepExecutionSplitter
,给定数据,PartitionHandler
“partitions”/将数据拆分为gridSize
部分,并将每个部分发送给独立的辅助线程=>thread
例如,数据库中有10行需要处理。如果您将gridSize
设置为5,并且您使用的是一个简单的分区逻辑,那么每个线程将有10/5=2行=>5个线程同时处理每行2行。网格大小只不过是一组任务(假设为一袋袋),单个分区步骤将被提升以进行处理。完成所有任务(一袋袋行李)后,它将返回下一组任务(一袋行李)。在这种情况下,gridSize必须是动态的(硬编码为10),它将在运行时根据拆分的数量进行配置,对吗?那么如何将分割信息的数量传递给TaskExecutorPartitionHandler呢?我指的是类似于或的东西。但是在开始作业之前没有确定拆分的数量。我不确定我是否理解您所说的网格大小必须是动态的。您可以在属性文件中定义它(grid size=“${job.grid.size}”
),然后驱动通过该文件生成的线程数。拆分的数量实际上是由gridSize
决定的。我的疑问是,在这种情况下,无论文件大小如何,拆分的数量都保持不变(因为拆分是由网格大小决定的,网格大小是恒定的)。理想情况下应该是这样吗?作为一个框架,Spring Batch不会估计处理文件所需的线程数量,因为这种知识可能取决于许多业务/其他因素。如果在作业运行之前,您有一个决定文件大小和线程数的东西,那么您肯定可以动态设置gridSize
。通常,可以将gridSize
看作是具有不同节点/主机的“真实”网格的大小。线程只是网格的众多示例之一。