在JSR352批处理中,我正在运行一个分区步骤来创建多个JSON对象。
每个线程都从oracle读取一些数据并作为JSON对象写入。在某些情况下,resultSet.next()超时并引发异常,并进入ItemReader和ItemWriter类的close()方法以清理所有资源。很好。
但是我对writer的close()方法有一些要求。编写器完成后需要执行此操作。但是,当ItemReader上存在异常时,我不确定如何在close()方法上获取异常详细信息。如果在ItemReader上发生异常,则close()方法不应执行DAO调用。无论如何在ItemWriter类中标识ItemReader异常。
@Override
public Object readItem() throws Exception {
Map<String, Object> resultMap = new HashMap<>();
if (firstObject && null != resultSet && resultSet.isBeforeFirst()) {
firstObject = false;
return columnMetaDataMap;
}
else if (null != resultSet && resultSet.next()) {
recordNumber++;
for (int i = 1; i <= rsMetaData.getColumnCount(); i++) {
resultMap.put("C" + i, resultSet.getObject(i));
}
return resultMap;
}
return null;
ItemWriter类close():
@Override
public void close() throws Exception {
gsonWriter.endArray();
gsonWriter.flush();
gsonWriter.close();
subjectAreaCode = categoryCode+"/"+subCategoryCode+"/";
logger.info("***Exception catch from writer for the file:"+outFile+"\n"+stepcontext.getException());
if (file.length() == 2) {
file.delete();
gahRptExecStatUpdDAO.updateBatchRptStatus(outFile, GAHRptStatusConstants.NO_ROWS_TO_PROC);
}
最佳答案
如果定义了ItemReadListener,它将在onReadError方法中获得控制权,因此您将知道ItemReader中有异常。然后,您可以在StepContext瞬时用户数据(setTransientUserData())中的对象中添加一些标志。在ItemWriter close方法中,您可以从“步骤上下文”中获取瞬态用户数据,并根据其中的内容采取相应的措施。
或者只是在ItemReader的catch块中设置标志,以处理从readItem中引发的任何事情。