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

如何将文件名从文件读取器传递到文件写入器spring批处理

施自珍
2023-03-14

我正在从文件夹中读取多个文件。假设文件名为test1.txt、test2.txt、test3.txt。我希望将这些文件名传递给writer和生成的输出文件名,如'test1.xml''test2.xml''test3.xml。

感谢你在这方面的帮助。

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Value("classpath*:test*.txt")
private Resource[] inputFiles;

@Value("${fluent.ttrade.Location.Outbound}")
private String outPutLocation;
@Bean
public MultiResourceItemWriter<DeliveryOrder> multiResourceBlkdItemWriter() throws Exception {
    MultiResourceItemWriter<DeliveryOrder> multiWriter = new MultiResourceItemWriter<DeliveryOrder>();
    multiWriter.setDelegate(blkdItemWriter());
    String customerOutputPath = outPutLocation + "test1.xml";
    System.out.println(">> Output Path: " + customerOutputPath);
    multiWriter.setResource(new FileSystemResource(customerOutputPath));
    return multiWriter;
}


@Bean
public MultiResourceItemReader<trade> multiResourceBlkdItemReader() {
    MultiResourceItemReader<trade> reader = new MultiResourceItemReader<trade>();
    reader.setDelegate(blkdItemReader());
    reader.setResources(inputFiles);
    return reader;
}

@Bean
public FlatFileItemReader<trade> blkdItemReader() {
    FlatFileItemReader<trade> reader = new FlatFileItemReader<>();

    DefaultLineMapper<trade> customerLineMapper = new DefaultLineMapper<>();

    FixedLengthTokenizer tokenizer = new FixedLengthTokenizer();
    tokenizer.setNames(new String[] { "recordType"});
    tokenizer.setColumns(new Range[] { });

    customerLineMapper.setLineTokenizer(tokenizer);
    customerLineMapper.setFieldSetMapper(new MYFieldSetMapper());
    customerLineMapper.afterPropertiesSet();

    reader.setLineMapper(customerLineMapper);

    return reader;
}

@SuppressWarnings("deprecation")
@Bean
public CustomStaxEventItemWriter<order> blkdItemWriter() throws Exception {

    //some code here

    itemWriter.setHeaders(listHeaders);
    itemWriter.setMarshaller(marshaller);
    itemWriter.setRootTagName("blkdFile");
    itemWriter.setFooterCallback(blkdFooterCallBack());
    itemWriter.afterPropertiesSet();
    return itemWriter;
}

@Bean
public BlkdFooterCallBack blkdFooterCallBack() {
    BlkdFooterCallBack callback = new BlkdFooterCallBack();
    return callback;
}

@Bean
public BlkdItemProcessor blkdItemProcessor() {
    return new BlkdItemProcessor();
}

@Bean
public JobExecutionListener listener() {
    return new EtradeResultJobListener();
}

@Bean
public Step step1() throws Exception {
    return stepBuilderFactory.get("step1")
            .<trade, order> chunk(2000)
            .reader(multiResourceBlkdItemReader())
            .processor(blkdItemProcessor())
            .writer(multiResourceBlkdItemWriter())
            .listener(blkdFooterCallBack())
            .build();
}

@Bean
public Job job() throws Exception {
    return jobBuilderFactory.get("job")
            .start(step1())
            .listener(listener())
            .build();
}

共有1个答案

鲁泰宁
2023-03-14

Spring Batch有一个叫做ResourceAware的接口。在其中,当使用MultiResourceItemReader时,如果返回的项实现了该接口,我们将注入该项所来自的资源。这使您能够获得所需的关于该项来自哪个文件的所有信息。您可以在javadoc中阅读更多关于该接口的信息:https://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/resourceaware.html

 类似资料:
  • 我有从多个文件读取并写入多个文件的Spring批处理配置。是否可以只写入从多个读取的一个文件。假设我收到巨大的XML文件,我将XML拆分为小文件并使用分区器并行读取小文件。但我需要将从不同的小xml文件读取的所有数据写入一个输出文件。Spring批处理是否可以做到这一点?我知道通过使写入器同步是可能的,但我正在寻找任何其他可能的方式作业配置 我得到错误组织。springframework。一批项目

  • 我正在尝试创建一个应用程序,该应用程序使用spring-batch-excel扩展名来读取用户通过web界面上传的Excel文件,以便解析Excel文件中的地址。 当代码运行时,没有错误,但我得到的只是我日志中的以下内容。即使我的处理器和Writer中都有log/syso(它们从未被调用过,我所能想象的是它没有正确读取文件,也没有返回要处理/写入的数据)。是的,这个文件有数据,实际上有几千条记录。

  • 问题内容: 我正在尝试运行一个应用程序(例如),因此它将从文件中读取stdin并从stdout写入另一个文件。 目前我有 它可以按预期工作,因为我可以对该文件进行某些操作,并且top可以接收它。但是我无法重定向top的输出。我该如何实现? 编辑: 好吧,让我们从头开始。我正在测试: 问题答案: 让我们忘掉这似乎是一条红色的鲱鱼。 要将stdin或stdout映射到文件,可以使用重定向: 甚至:

  • 问题内容: 我必须阅读tomcat日志文件,并在一段时间(例如:一个小时)后再次读取该文件(仅针对新添加的内容),因此我创建了RandomAccessFile来记录我完成的最后一个位置并使用BufferedReader.readLine()方法。 但是,我发现有时我无法读取文件的整行。 例如,tomcat正在尝试编写以下内容(仅作为示例): 192.168.0.0本地主机/index.html .

  • 问题内容: 我在JAR文件中有一个文件。这,例如。 我该如何访问?我的源代码是: 问题答案: 您不能使用File,因为此文件在文件系统上并不独立存在。相反,您需要getResourceAsStream(),如下所示: