当前位置: 首页 > 知识库问答 >
问题:

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

仇建茗
2023-03-14

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

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

如何更改下面的配置,创建一个分区ID自动挂起到文件名的文件,而不必为每个分区ID注册一个新的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个答案

令狐钧
2023-03-14

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

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

 类似资料:
  • 问题内容: 我想要一个log4j配置,这样日志文件名应该像$ {System-name} log.log。也就是说,如果该应用程序在任何系统上启动,则无需更改配置文件或代码。它应该生成提到的日志文件名。谢谢。 问题答案: 我这样做: 1)通过以下方式初始化记录器: 2)在log4j.xml中我使用变量:

  • 我正在开发一个应用程序,在那里人们将从数据库中提到的一个位置下载所需的文件到他们的本地。我使用Struts2从服务器下载文件。我可以下载的文件没有任何例外,它的工作完美。但是要下载的文件具有我在struts.xml中指定的文件名,我希望它是要下载的文件名。示例如果原始文件名是struts.pdf,我正在下载它作为download.pdf,如何防止它和下载实际文件名的文件 我的struts.xml配

  • 你知道 Puppet 能做微创手术吗? 通常,我们不希望将整个配置文件交由 Puppet 管理而仅仅是在配置文件中添加某项设置 — 尤其是如果该文件是由别人管理,我们不能覆盖它的情况。 一种简单而有用的方法是,如果配置文件中不存在指定的行就添加这行配置。例如: 添加一个内核模块名到配置文件 /etc/modules 告知内核在启动时加载此模块。 你可以使用一个 exec 资源达成此任务。下面的例子

  • 我是新的spring批处理框架和石英调度器。我的任务是使用quartz调度器动态调度一个新的spring批处理作业。所有新的spring批处理作业的条目都在我的数据库中,具有触发器表达式。问题是,对于每一个来自数据库的新的spring批处理作业,我们需要将其包装在Quartz的调度器作业中。这就意味着,当有许多spring批处理作业时,就应该有许多批处理作业类来包装它们,并由quartz调度程序运

  • 我正在尝试对我的应用程序做类似的事情。我正在使用以下版本的Spring boot和Cassandra: Spring数据卡桑德拉-2.0。8.释放Spring护套启动器父级-2.0。4.RELEASE我需要动态更改Cassandra的一些属性(主要是主机名),并希望它与应用程序建立新的连接。对于配置更改,我们有内部云配置更改管理,它在更改时运行良好,并侦听更改。这是我的班级: 但是,当我尝试将@R

  • Mac os对我来说是新的。我最近在MAC OS上安装了MAMP。我已将我的php项目放入 应用程序/MAMP/htdocs 当我执行这个代码我得到的URL作为 因为网址说它使用8888端口,我不想在我的网址8888,因为我的项目有各种重定向。所以我尝试改变MAMP上的端口------ 优势-----imade它设置默认的apace和MySql端口 但是在ist之后,当我重新启动MAMP时,我找到