我正在为我们的文件上传过程实现一个 spring 批处理作业。我的要求是读取一个平面文件,应用业务逻辑,然后将其存储在数据库中,然后发布一条 Kafka 消息。
我有一个基于块的步骤,它使用自定义读取器、处理器、写入器。该过程运行良好,但需要大量时间来处理大文件。
处理一个有 60K 条记录的文件需要 15 分钟。我需要将它减少到 5 分钟以内,因为我们将消耗比这更大的文件。
根据 https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html,我理解使其成为多线程会以重启能力为代价提高性能。但是,我使用的是 FlatFileItemReader、ItemProcessor、ItemWriter,但它们都不是线程安全的。
关于如何提高性能的任何建议?
这是编写器代码:-
public void write(List<? extends Message> items) {
items.forEach(this::process);
}
private void process(Message message) {
if (message == null)
return;
try {
//message is a DTO that have info about success or failure.
if (success) {
//post kafka message using spring cloud stream
//insert record in DB using spring jpaRepository
} else {
//insert record in DB using spring jpaRepository
}
} catch (Exception e) {
//throw exception
}
}
最好的问候, 普雷蒂
答案 0 :(得分:0)
请参考下面的SO线程并参考git hub源代码进行并行处理
Spring Batch multiple process for heavy load with multiple thread under every process