如何更改我的作业配置以动态添加文件名

时间:2016-08-06 12:45:32

标签: spring spring-batch

我有一个弹出批处理作业,它从db读取然后输出到多个csv' s。在我的db中,我有一个名为divisionId的特殊列。对于divisionId的每个不同值,都应存在CSV文件。我使用ClassifierCompositeItemWriter分割出数据。

目前我为divisionId的每个不同值定义了一个ItemWriter bean。 bean是相同的,它只是不同的文件名。

如何更改以下配置以创建一个文件,其中divisionId自动预先设置为文件名,而无需为每个divisionId注册新的ItemWriter?

我一直在玩@JobScope和@StepScope注释,但无法正确使用。

提前致谢。

@Bean
public Step readStgDbAndExportMasterListStep() {
    return  commonJobConfig.stepBuilderFactory
                .get("readStgDbAndExportMasterListStep")
                .<MasterList,MasterList>chunk(commonJobConfig.chunkSize)
                .reader(commonJobConfig.queryStagingDbReader())
                .processor(masterListOutputProcessor())
                .writer(masterListFileWriter())
                .stream((ItemStream) divisionMasterListFileWriter45())
                .stream((ItemStream) divisionMasterListFileWriter90())
                .build();
}

@Bean
public ItemWriter<MasterList> masterListFileWriter() {
    BackToBackPatternClassifier classifier = new BackToBackPatternClassifier();
    classifier.setRouterDelegate(new DivisionClassifier());
    classifier.setMatcherMap(new HashMap<String, ItemWriter<? extends MasterList>>() {{
        put("45", divisionMasterListFileWriter45());
        put("90", divisionMasterListFileWriter90());
    }});
    ClassifierCompositeItemWriter<MasterList> writer = new ClassifierCompositeItemWriter<MasterList>();
    writer.setClassifier(classifier);
    return writer;
}   

@Bean
public ItemWriter<MasterList> divisionMasterListFileWriter45() {
    FlatFileItemWriter<MasterList> writer = new FlatFileItemWriter<>();
    writer.setResource(new FileSystemResource(new File(commonJobConfig.outDir, "45_masterList" + "" + ".csv")));
    writer.setHeaderCallback(masterListFlatFileHeaderCallback());
    writer.setLineAggregator(masterListFormatterLineAggregator());
    return writer;
}   

@Bean
public ItemWriter<MasterList> divisionMasterListFileWriter90() {
    FlatFileItemWriter<MasterList> writer = new FlatFileItemWriter<>();
    writer.setResource(new FileSystemResource(new File(commonJobConfig.outDir, "90_masterList" + "" + ".csv")));
    writer.setHeaderCallback(masterListFlatFileHeaderCallback());
    writer.setLineAggregator(masterListFormatterLineAggregator());
    return writer;
}   

1 个答案:

答案 0 :(得分:0)

我提出了一种非常复杂的方法。我在https://github.com/langmi/spring-batch-examples/wiki/Rename-Files点了一个教程。

前提是使用步骤执行上下文将文件名放入其中。