java - 在 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());
}
}
但我收到一个错误,即文件仍处于打开状态或仍在被读取。
解决方案
我不知道这是否是在 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;
}
推荐阅读
- javascript - 在加载过程中显示文本
- count - BigQuery 到 Data Studio :无论所选时间段如何,都显示可靠的 COUNT DISTINCT
- c - 无法将文件描述符设置为阻塞模式
- c# - Xamarin 和谷歌地图上的不同距离
- c# - OData 区分大小写问题
- vuetify.js - 加载vuetify Treeview时如何设置选定的孩子?
- python - 在另一个数组中查找数组索引
- hibernate - Hibernate-SpringBoot:无法在 RESOURCE hibernate.cfg.xml 中的第 0 行和第 0 列执行解组。消息:空
- apache - 使用 AND 语句检查 htaccess 文件中的两个 cookie
- wordpress - 如何在自定义元提交的 woocommerce 上显示产品价格?