java—在sping batch中通过jsonitemreader读取json文件的内容后删除json文件

aiqt4smr  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(407)

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

    }

但我得到一个错误,该文件仍在打开或仍在读取。

xzv2uavs

xzv2uavs1#

我不知道这是不是在jsonitmreader步骤之后删除json文件的正确而有效的方法,但是这种方法对我来说很有效。
我所做的是用tasklet创建了一个新的步骤来删除所说的json文件。下面是示例代码。
tasklet类:

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

相关问题