如何识别 ItemWriter 中的异常(从 ItemReader、readItem 方法发生)

How to identify an exception(which is happened from ItemReader, readItem method) in ItemWriter

在JSR352批处理中,我是运行一个分区步骤创建多个JSON对象。 每个线程,从 oracle 中读取一些数据并写入 JSON 对象。在某些情况下,resultSet.next() 超时并抛出异常并转到 ItemReader 和 ItemWriter class 的 close() 方法来清理所有资源。这很好。 但是我对作者的 close() 方法有一些 dao 调用。这需要在编写器完成时执行。但是当 ItemReader 出现异常时,我不确定如何在 close() 方法上获取异常详细信息。如果异常发生在 ItemReader 上,则 close() 方法不应执行 DAO 调用。无论如何在 ItemWriter class.

中识别 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 class 关闭():

 @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 关闭方法中,您可以从步骤上下文中获取临时用户数据,并根据其中的内容采取相应的行动。
或者只是在 ItemReader 中的 catch 块中设置标志以处理从 readItem 中抛出的任何内容。