我试图批量处理简单文件。我明白我无法多线程。所以至少我试图在增加块参数时表现更好:
@Bean
public Step processFileStep() {
return stepBuilderFactory.get("processSnidFileStep")
.<MyItem, MyItem>chunk(10)
.reader(reader())
....
我的逻辑需要处理器“过滤”我们的无效记录。 但是我发现处理器不能得到块...但是一次只能找到一个项目:
public interface ItemProcessor<I, O> {
O process(I item) throws Exception;
}
在我的情况下,我需要访问数据库并在那里验证我的记录。所以对于每个项目,我必须查询数据库(而不是一起使用一堆项目)
我不能多线程或让我的流程表现更好?我在这里想念的是什么?从文件中逐个处理每条记录需要很长时间。
感谢。
答案 0 :(得分:0)
在Spring Batch面向块的处理体系结构中,唯一可以访问完整记录块的组件是ItemWriter
。
因此,如果您想进行任何类型的批量处理,那么您通常会这样做。使用ItemWriteListener#beforeWrite
或通过实施自己的自定义ItemWriter
。
答案 1 :(得分:0)
从过去的讨论中,CSV阅读器可能存在严重的性能问题。使用其他CSV解析器编写阅读器可能会更好。
根据您的验证数据,您可能会创建一个作业范围的过滤器bean,它包装一个可以非常快速地预加载或延迟加载的Map。这样,您可以将数据库上的命中数限制为初始化或第一次引用(分别),并将过滤时间减少到hashmap lookaside。