Multithreading 单文件到多文件的Spring批处理多线程处理
我的问题陈述。读取包含1000万数据的csv文件并将其存储在db中。尽可能缩短时间。Multithreading 单文件到多文件的Spring批处理多线程处理,multithreading,spring,spring-batch,Multithreading,Spring,Spring Batch,我的问题陈述。读取包含1000万数据的csv文件并将其存储在db中。尽可能缩短时间。 我使用java的简单多线程执行器实现了它,其逻辑几乎类似于SpringBatch的块。从csv文件中读取预配置数量的数据,然后创建一个线程,并将数据传递给线程,该线程验证数据,然后写入在多线程中运行的文件。完成所有任务后,我将调用sql loader来加载每个文件。现在我想将此代码移动到spring batch(我是spring batch的新手) 以下是我的问题 1.在任务中,是否可以使ItemReader到
我使用java的简单多线程执行器实现了它,其逻辑几乎类似于SpringBatch的块。从csv文件中读取预配置数量的数据,然后创建一个线程,并将数据传递给线程,该线程验证数据,然后写入在多线程中运行的文件。完成所有任务后,我将调用sql loader来加载每个文件。现在我想将此代码移动到spring batch(我是spring batch的新手)
以下是我的问题
1.在任务中,是否可以使ItemReader到ItemWriter多线程化(当我读取文件时,在线程写入数据之前创建一个新线程来处理数据)?如果没有,我需要创建两个步骤第一步读取文件,这是单线程的,另一步是多线程写入单个文件,但是如何将数据列表从上一个任务传递到另一个任务
2.如果单个线程中出现任何故障,如何停止整个批处理作业处理。
3.如果在一定时间间隔后出现故障,如何重试批处理作业。我知道在失败的情况下有重试选项,但在失败的情况下,我找不到在一定时间间隔后重试任务的选项。在这里,我不是在谈论调度程序,因为我已经在调度程序下运行了批处理作业,但一旦失败,它必须在3分钟后重新运行
我希望我的指示能有所帮助。以下是我解决问题的方法
您可以将输入文件拆分为多个文件,使用Partitionner并用线程加载小文件,但出现错误时,必须在数据库清理后重新启动所有作业
<batch:job id="transformJob">
<batch:step id="deleteDir" next="cleanDB">
<batch:tasklet ref="fileDeletingTasklet" />
</batch:step>
<batch:step id="cleanDB" next="split">
<batch:tasklet ref="countThreadTasklet" />
</batch:step>
<batch:step id="split" next="partitionerMasterImporter">
<batch:tasklet>
<batch:chunk reader="largeCSVReader" writer="smallCSVWriter" commit-interval="#{jobExecutionContext['chunk.count']}" />
</batch:tasklet>
</batch:step>
<batch:step id="partitionerMasterImporter" next="partitionerMasterExporter">
<partition step="importChunked" partitioner="filePartitioner">
<handler grid-size="10" task-executor="taskExecutor" />
</partition>
</batch:step>
</batch:job>
满满的
希望能有所帮助。感谢@bellabax的建议,我已经完成了使用分段的示例项目并行工作,但我仍然不喜欢使用分段,因为分段涉及DB操作,而我真的不喜欢,因为分段将创建一个超头任务(在我的情况下)将数据写入数据库,然后从数据库读取数据,写入文件,最后调用sql loader,我的另一个限制是我在列中使用ADT数据,因此sql loader为我提供了更好的方法。嗨,我有一个问题,我想处理XML中的数百万用户,并将其转储到数据库中,并希望使用覆盖线程/分区,你能给出你的实现的示例吗?这样我就可以引用它了,因为RII在分割文件时有两个问题。首先,较大的文件包含页眉和页脚记录,不确定文件何时被拆分,如何找到页眉和页脚记录以对其执行某些业务验证。第二个问题,如何确保文件不会被拆分,不会打断中间的行?