在 Spring Batch 中通过 Json ItemReader 读取内容后删除 json 文件

Delete the json file after reading its content via JsonItemReader in Sping Batch

如何在通过 JsonItemReader 读取内容后删除 json 文件?

下面是我的 JsonItemReader 的示例代码。

@Bean
@StepScope
public JsonItemReader<MyObj> myReader() {

    LOGGER.info(LOG_TEMPLATE,
            getClass().getSimpleName(),
            Thread.currentThread().getStackTrace()[1].getMethodName(),
            "Inside Reader...");

    final ObjectMapper mapper = new ObjectMapper();

    final JacksonJsonObjectReader<MyObj> jsonObjectReader = new JacksonJsonObjectReader<>(
            MyObj.class);
    jsonObjectReader.setMapper(mapper);

    final String filePath = config.getRootfolder() + SEPERATOR + inputInfo.getFileName();

    return new JsonItemReaderBuilder<MyObj>().jsonObjectReader(jsonObjectReader)
            .resource(new FileSystemResource(filePath))
            .name("myReader")
            .build();

}

然后我在 JobListener 中添加了一个代码,在作业执行后它将删除所述文件。这是示例代码。

@Override
    public void afterJob(JobExecution jobExecution) {

        if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
            LOGGER.info(LOG_TEMPLATE,
                    getClass().getSimpleName(),
                    Thread.currentThread().getStackTrace()[1].getMethodName(),
                    "Job Completed, verify results.");
        } else {
            LOGGER.error(LOG_TEMPLATE,
                    getClass().getSimpleName(),
                    Thread.currentThread().getStackTrace()[1].getMethodName(),
                    "Job ended abnormally.");
        }

        try {
            Files.delete(Paths.get(config.getRootfolder() + "/" + inputInfo.getFileName()));
        } catch (final IOException ex) {

            LOGGER.error(LOG_TEMPLATE,
                    getClass().getSimpleName(),
                    Thread.currentThread().getStackTrace()[1].getMethodName(),
                    ex.getMessage());
        }

    }

但我收到一个错误消息,指出文件仍处于打开状态或仍在读取中。

我不知道这是否是在 JsonItemReader 步骤之后删除 json 文件的正确有效方法,但这种方法对我有用。

我所做的是使用 Tasklet 创建了一个新步骤,删除了上述 json 文件。 这是示例代码。

小任务 Class:

@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

    LOGGER.info(LOG_TEMPLATE,
            getClass().getSimpleName(),
            Thread.currentThread().getStackTrace()[1].getMethodName(),
            "Inside Delete Json File Tasklet");

    try {

        final String filePath = config.getRootfolder() + SEPARATOR + inputInfo.getFileName();
        Files.delete(Paths.get(filePath));

    } catch (final IOException ex) {

        LOGGER.error(LOG_TEMPLATE,
                getClass().getSimpleName(),
                Thread.currentThread().getStackTrace()[1].getMethodName(),
                ex.getMessage());
    }

    return RepeatStatus.FINISHED;
}