繁体   English   中英

Spring Batch FlatFileItemReader 在以后的步骤中提供文件名

[英]Spring Batch FlatFileItemReader provide filename in future step

所以我正在构建一个使用 Spring Batch 的批处理。 我定义了一个有几个步骤的作业,第一个是 Tasklet 的实现,它是一个文件观察器,并检查与特定文件掩码匹配的任何文件的目录。 找到该文件后,我们将继续进行该过程的下一步。 最初,这也是 Tasklet 的另一种实现,我们循环遍历文件和每条记录,批量加载到 Oracle。 这花费的时间太长了。 我发现使用 FlatFileItemReader 和 JdbcBatchItemWriter 确实快了 1000 倍。 无论如何,我的问题是,当使用 FlatFileItemReader 时,我必须定义我的资源并在创建该 Bean 时提供 FileSystemResouce。 我真的想在我的第一步完成后提供该文件名,因为我需要运行一个文件观察器并找出我们想要处理的文件名。 有没有办法实现这一目标?

@Bean
public FlatFileItemReader<PartnerRelationship> partnerRelationshipReader() throws ParseException {
    FlatFileItemReader<PartnerRelationship> reader = new FlatFileItemReader<>();
    reader.setResource(new FileSystemResource("/path/to/my/file/file_20210714.dat"));
    reader.setBufferedReaderFactory(new CustomFileReaderFactory());
    reader.setStrict(false);
    reader.setLineMapper(new DefaultLineMapper<PartnerRelationship>() {{
        setLineTokenizer(new FixedLengthTokenizer() {{
            setNames(Constants.partnerRelationshipFields);
            setColumns(Constants.partnerRelationshipIndeces);
        }});
        setFieldSetMapper(new PartnerRelationshipFieldSetMapper());
    }});
    return reader;
}

您可以将资源传递给 jobExecutionContext:

ExecutionContext jobExecutionContext = stepExecution.getJobExecution().getExecutionContext();
jobExecutionContext.put("resource", res);

如果您设置了 bean stepScope,则可以检索它:

@Bean
@StepScope
public FlatFileItemReader<PartnerRelationship> partnerRelationshipReader(@Value #{jobExecutionContext['resource']} Resource res) throws ParseException {
    FlatFileItemReader<PartnerRelationship> reader = new FlatFileItemReader<>();
    reader.setResource(res);
    reader.setBufferedReaderFactory(new CustomFileReaderFactory());
    reader.setStrict(false);
    reader.setLineMapper(new DefaultLineMapper<PartnerRelationship>() {{
        setLineTokenizer(new FixedLengthTokenizer() {{
            setNames(Constants.partnerRelationshipFields);
            setColumns(Constants.partnerRelationshipIndeces);
        }});
        setFieldSetMapper(new PartnerRelationshipFieldSetMapper());
    }});
    return reader;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM