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