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

FlatFileItemWriter在每个JobExecution上写入一个新的(不存在的)文件

程俊誉
2023-03-14

我目前正在处理一个Spring Batch CSV导出。使用基于块的读取器、写入器和处理器。读取和处理工作无懈可击,但是FlatFileItemWriter总是覆盖输出的CSV文件。我希望作业检查是否存在一个文件,如果它存在,增加文件名,并写到一个新的文件。

下面是我当前的代码:Helper类,它检查文件是否存在,并返回新字符串供编写器使用。

import java.io.File;

import org.springframework.stereotype.Component;

@Component
public class OrderFileManager {

    private final String orderDesc = "order";
    private final String fileEnding = ".csv";

    public String getEmptyOrderNameString() {

        int fileNumber = 1;
        String answer = orderDesc + fileNumber + fileEnding;

        while (new File(answer).exists()) {
            fileNumber = fileNumber + 1;
            answer = orderDesc + fileNumber + fileEnding;
        }
        return answer;
    }
}

我的项目编写器:

    @Bean
    public FlatFileItemWriter<UltravisionOrder> writer(String fileName) {
        FlatFileItemWriter<UltravisionOrder> writer = new FlatFileItemWriter<UltravisionOrder>();  
        writer.setResource(new FileSystemResource(fileName));
        DelimitedLineAggregator<UltravisionOrder> delimitedLineAggregator = new DelimitedLineAggregator<UltravisionOrder>();
        delimitedLineAggregator.setDelimiter(";");
        BeanWrapperFieldExtractor<UltravisionOrder> fieldExtractor = new BeanWrapperFieldExtractor<UltravisionOrder>();
        fieldExtractor.setNames(new String[] { "col1", "col2", "col3", ... });
        delimitedLineAggregator.setFieldExtractor(fieldExtractor);
        writer.setLineAggregator(delimitedLineAggregator);
        return writer;
    }

每次执行作业时,FileWriter都会写入相同的输出文件。OrderFileManager在工作中是独立的。编写器接收OrderFileManager。作为参数的getEmptyOrderNameString()。

共有1个答案

司空胤
2023-03-14

如果Spring应用程序上下文没有在每次作业运行时重新加载,那么文件编写器bean将被重新使用,并且始终写入相同的资源。

您可以通过调用使用SpEL表达式生成文件名的方法来确定writer步骤的范围并对其进行配置

@Bean
@StepScope
public FlatFileItemWriter<UltravisionOrder> itemWriter(@Value("#{orderFileManager.getEmptyOrderNameString()}") String fileName) {
    // ...
}
 类似资料:
  • 我如何让IntelliJ IDEA在文件的每一端插入一个新行,这样GitHub就不会抱怨例如?

  • 我有以下文件在蒙戈收藏- 我想将此文档添加到Mongo,只有当具有,和值的类似文档中不存在时。 如果确实存在类似的文档,我希望仅更新timesSeen(递增1)和lastSeen(设置今天的日期)值。 这样做的正确和最有效的方法是什么?我是否可以使用一个命令来执行此操作,而无需在之前搜索相关文档并插入新文档/根据该命令更新现有文档

  • 问题内容: 我正在尝试将Flask应用程序上传到AWS,但是这样做却收到错误消息: 你的WSGIPath引用的文件不存在。 在进行一些在线挖掘之后,我发现在.ebextensions文件夹中,我应该指定路径。没有.ebextensions文件夹,因此我创建了一个文件夹,并将以下代码添加到名为settings.config的文件中: WSGIPath是application.py文件的正确路径,因此

  • 问题内容: 我有以下代码: 在控制台中,使用System.out.println(line)输出的代码为我提供了正确的输出。但是,当我打开CSV文件时,它似乎是反向写入的。Excel首先抱怨行数。但是,仅显示原始数据集的最后一行。数据集(以一种低效的方式进行了预处理)包含1000多个行。因此,我不能简单地附加每个条目。 有更好的方法吗? 提示和技巧非常受欢迎。更进一步,我尝试了一些编写器:-CSV

  • 昨天,我尝试使用Composer在我的Laravel 4项目中的一个项目上安装,我记不清事件链,但它没有成功安装。从那以后,我一直收到Composer内存不足的错误-。 我将php.ini

  • 阅读器bean 我尝试这样做:在FlatFileItemReader的实现中,将输入文件路径作为string属性添加到ExecutionContext的映射中。在我的FlatFileItemWriter实现中-重写setResource,并实际从ExecutionContext的值中创建一个Resource对象。这样行吗?