如何在ItemWriter

时间:2018-12-04 17:13:25

标签: java batch-processing websphere-liberty jsr352

在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);
        }

1 个答案:

答案 0 :(得分:2)

如果定义了ItemReadListener,它将在onReadError方法中获得控制,因此您将知道ItemReader中有异常。然后,您可以在StepContext瞬时用户数据(setTransientUserData())中的对象中放置一些标志。在ItemWriter close方法中,您可以从Step Context中获取瞬态用户数据,并根据其中的内容采取相应的操作。
或者只是在ItemReader的catch块中设置标志,以处理从readItem中引发的任何事情。