Spring批次:如何避免非法状态异常:输入资源必须存在

ds97pgxw  于 2023-02-12  发布在  Spring
关注(0)|答案(1)|浏览(192)

我正在使用Spring Batch with Java 11开发一个批处理应用程序。这是我的reader()方法:

@SuppressWarnings("unchecked")
@Bean
public FlatFileItemReader<MyClass> reader() {
    BeanWrapperFieldSetMapper beanWrapperMapper = new BeanWrapperFieldSetMapper<MyClass>();
    beanWrapperMapper.setTargetType(MyClass.class);

    return new FlatFileItemReaderBuilder<MyClass>()
            .name("MyClassReader")
            .resource(new FileSystemResource(inputFolder.concat(File.separator).concat("my-input-file.csv")))
            .delimited()
            .names("field1", "field2")
            .fieldSetMapper(beanWrapperMapper)
            .build();
}

我做了几个测试,当文件my-input-file.csv存在时,批处理工作正常。但是,我希望得到以下行为:如果文件my-input-file.csv丢失,我仍然希望将某些内容写入输出文件,并且不引发错误。现在,如果我运行批处理,但文件不在文件夹中,则会出现以下错误:

IllegalStateException: Input resource must exist (reader is in 'strict' mode): path [C:\\Users\\username\\Desktop\\src\\test\\resources\\my-input-file.csv]

我知道这个错误是因为找不到文件,但是我真的希望处理这个情况以生成一个不同的输出文件(我不希望批处理失败)。
如何才能做到这一点?

roejwanj

roejwanj1#

1.将strict属性设置为false,以便不会发生输入资源异常。
1.批处理作业完成后检查readCount。如果readCount == 0,表示没有数据,您在这里处理您的逻辑。
您的案例示例(实现JobExecutionListener):

@Override
public void afterJob(JobExecution jobExecution) {
    StepExecution[] stepExecutions = jobExecution.getStepExecutions().toArray(new StepExecution[]{});
    StepExecution stepExecution = stepExecutions[0];
    long readCount = stepExecution.getReadCount();
    if (readCount == 0) {
        // your logic
    }
}

相关问题