Как идентифицировать исключение (которое происходит из ItemReader, метод readItem) в ItemWriter - PullRequest
0 голосов
/ 04 декабря 2018

В пакете JSR352 я выполняю разделенный шаг для создания нескольких объектов JSON.Каждый поток читает некоторые данные из оракула и пишет как объект JSON.В некоторых случаях, resultSet.next () получает тайм-аут и выдает исключение и собирается закрыть метод () класса ItemReader и ItemWriter для очистки любых ресурсов.что прекрасноОднако у меня есть несколько дао-вызовов метода close () писателя.который должен быть выполнен, когда автор завершен.Но когда есть исключение ItemReader, я не уверен, как получить подробности об исключении для метода close ().Если исключение произошло в ItemReader, метод close () не должен выполнять вызов DAO.В любом случае можно определить исключение ItemReader в классе ItemWriter.

@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 голосов
/ 04 декабря 2018

Если у вас определен ItemReadListener, он получит управление в методе onReadError, поэтому вы будете знать, что у вас есть исключение в ItemReader.Затем вы можете поместить некоторый флаг в объект в переходных пользовательских данных StepContext (setTransientUserData ()).В методе ItemWriter close вы можете получить временные пользовательские данные из контекста шага и действовать соответственно в зависимости от того, что там было.
Или просто установить флаг из блока catch в ItemReader для обработки всего, что было выброшено из readItem.,

...