使用 Tasklet 方法时 FlatFileItemWriter 不生成文件
FlatFileItemWriter not generating the file when using Tasklet approach
我使用 tasklet
方法编写了以下代码来生成包含数据的文件。
public class PersonInfoFileWriter implements Tasklet {
@Autowired
PersonInfoFileUtil personInfoFileUtil;
public void write(ExecutionContext executionContext) throws IOException {
List<PersonInfo> personInfoList = null;
FlatFileItemWriter<PersonInfo> flatFileWriter = new FlatFileItemWriter<PersonInfo>();
flatFileWriter.setResource(new FileSystemResource("C:\test\"
+ LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE) + ".txt"));
try {
flatFileWriter.open(executionContext);
String personName = (String) executionContext.get("personInfo");
//gets the details of the person by name from the database and assign the values to PersonInfo
personInfoList = personInfoFileUtil.setDataForPersonInfoFile(personName);
flatFileWriter.setName("Person-Detail-File");
flatFileWriter.setShouldDeleteIfEmpty(true);
flatFileWriter.setAppendAllowed(true);
flatFileWriter.setLineSeparator("\n");
flatFileWriter.setHeaderCallback(new FlatFileHeaderCallback() {
@Override
public void writeHeader(Writer writer) throws IOException {
writer.write(
"PersonId^Name^Program^ProgramType");
}
});
flatFileWriter.setLineAggregator(new DelimitedLineAggregator<PersonInfo>() {
{
setDelimiter("^");
setFieldExtractor((FieldExtractor<PersonInfo>) new BeanWrapperFieldExtractor<PersonInfo>() {
{
setNames(new String[] { "personId", "name", "program", "programType" });
}
});
}
});
String lines = flatFileWriter.doWrite((List<? extends PersonInfo>) personInfoList);
logger.info(lines); //this prints the information correctly
} finally {
flatFileWriter.close();
}
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
ExecutionContext executionContext = contribution.getStepExecution().getJobExecution().getExecutionContext();
write(executionContext);
return RepeatStatus.FINISHED;
}
}
以上代码编译和运行没有错误,但它没有在磁盘上生成任何文件。
我尝试调试以检查文件名等值是否被创建到缓冲区以写入磁盘,除了生成数据并将数据写入文件外,一切都按预期工作。
如果我使用基于块的方法编写代码,它工作正常。
如果我做错了,请告诉我。提前感谢您的帮助。
编辑: 添加建议的更改后,文件正在磁盘上创建,但文件丢失了我使用 setHeaderCallback()[=12 设置的 header =]
在您的 write
方法中,您创建了一个 FlatFileItemWriter
的实例,在其上设置了一些属性,然后在其上调用 close
。
您没有调用 open()
和 write()
方法,这就是它没有生成文件的原因。
我使用 tasklet
方法编写了以下代码来生成包含数据的文件。
public class PersonInfoFileWriter implements Tasklet {
@Autowired
PersonInfoFileUtil personInfoFileUtil;
public void write(ExecutionContext executionContext) throws IOException {
List<PersonInfo> personInfoList = null;
FlatFileItemWriter<PersonInfo> flatFileWriter = new FlatFileItemWriter<PersonInfo>();
flatFileWriter.setResource(new FileSystemResource("C:\test\"
+ LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE) + ".txt"));
try {
flatFileWriter.open(executionContext);
String personName = (String) executionContext.get("personInfo");
//gets the details of the person by name from the database and assign the values to PersonInfo
personInfoList = personInfoFileUtil.setDataForPersonInfoFile(personName);
flatFileWriter.setName("Person-Detail-File");
flatFileWriter.setShouldDeleteIfEmpty(true);
flatFileWriter.setAppendAllowed(true);
flatFileWriter.setLineSeparator("\n");
flatFileWriter.setHeaderCallback(new FlatFileHeaderCallback() {
@Override
public void writeHeader(Writer writer) throws IOException {
writer.write(
"PersonId^Name^Program^ProgramType");
}
});
flatFileWriter.setLineAggregator(new DelimitedLineAggregator<PersonInfo>() {
{
setDelimiter("^");
setFieldExtractor((FieldExtractor<PersonInfo>) new BeanWrapperFieldExtractor<PersonInfo>() {
{
setNames(new String[] { "personId", "name", "program", "programType" });
}
});
}
});
String lines = flatFileWriter.doWrite((List<? extends PersonInfo>) personInfoList);
logger.info(lines); //this prints the information correctly
} finally {
flatFileWriter.close();
}
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
ExecutionContext executionContext = contribution.getStepExecution().getJobExecution().getExecutionContext();
write(executionContext);
return RepeatStatus.FINISHED;
}
}
以上代码编译和运行没有错误,但它没有在磁盘上生成任何文件。
我尝试调试以检查文件名等值是否被创建到缓冲区以写入磁盘,除了生成数据并将数据写入文件外,一切都按预期工作。
如果我使用基于块的方法编写代码,它工作正常。
如果我做错了,请告诉我。提前感谢您的帮助。
编辑: 添加建议的更改后,文件正在磁盘上创建,但文件丢失了我使用 setHeaderCallback()[=12 设置的 header =]
在您的 write
方法中,您创建了一个 FlatFileItemWriter
的实例,在其上设置了一些属性,然后在其上调用 close
。
您没有调用 open()
和 write()
方法,这就是它没有生成文件的原因。