首页 > 解决方案 > 在 Sping Batch 中通过 JsonItemReader 读取内容后删除 json 文件

问题描述

通过 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());
        }

    }

但我收到一个错误,即文件仍处于打开状态或仍在被读取。

标签: javajsonspringspring-batchnio

解决方案


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

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

小任务类:

@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;
}

推荐阅读