Как использовать onReadError / onWriteError в ReaderListener / WriterListener для обработки исключений - PullRequest
0 голосов
/ 18 июня 2020

Он просто генерирует исключение и не запускает «onReadError»

PS: mst_employees1 - это таблица данных, которой не существует, для имитации аномалий

    @Bean
    private Step step1(MyBatisCursorItemReader<MstEmployeesEntity> myBatisReader,FlatFileItemWriter<MstEmployeesEntity> CSVWriter){
        return stepBuilderFactory
                .get("step1")
                .listener(stepListener)
                .<MstEmployeesEntity,MstEmployeesEntity>chunk(1)
                .reader(myBatisReader)
                .listener(readerListener)
                .processor(myPorcessor)
                .writer(CSVWriter)
                .build();
    }
    @Bean
    @StepScope
    public MyBatisCursorItemReader<MstEmployeesEntity> myBatisReader(@Value("#{jobParameters['para1']}") Integer pk) {
        Map<String, Object> map = new HashMap<>();
        map.put("employeePk",pk);
        return new MyBatisCursorItemReaderBuilder<MstEmployeesEntity>()
                .sqlSessionFactory(sqlSessionFactory)
                .queryId("jp.armg.toughness.datasource.mapper.BatchMstEmployeesEntityMapper.exmapleSelect")
                .parameterValues(map)
                .build();
    }

Класс задания

public class ReaderListener implements ItemReadListener<MstEmployeesEntity> {

    @Override
    public void onReadError(Exception ex) {
        // TODO Auto-generated method stub
        System.out.println("++++++++++++++++++++++++++++++++++++++");
        System.out.println("on read error: " + ex.getMessage());
        System.out.println("======================================");
    }
}

Слушатель чтения

<mapper namespace="jp.armg.toughness.datasource.mapper.BatchMstEmployeesEntityMapper">
    <select id="exmapleSelect" resultType="jp.armg.toughness.datasource.entity.MstEmployeesEntity">
        select * from mst_employees1 where employee_pk &lt; #{employeePk};
    </select>
</mapper>

Mapper

org.springframework.batch.item.ItemStreamException: Failed to initialize the reader
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:152) ~[spring-batch-infrastructure-4.1.2.RELEASE.jar:4.1.2.RELEASE]
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader$$FastClassBySpringCGLIB$$ebb633d0.invoke(<generated>) ~[spring-batch-infrastructure-4.1.2.RELEASE.jar:4.1.2.RELEASE]

Console

Он просто генерирует исключение и не запускает «onReadError»

PS: mst_employees1 - это таблица данных, которая не существует для моделирования аномалий

1 Ответ

0 голосов
/ 18 июня 2020

mst_employees1 - это таблица данных, которая не существует для моделирования аномалий

Этот вид аномалий следует проверять безотказно во время инициализации считывателя (как текущее поведение), а не во время чтения элементов. ItemReadListener предназначен для ошибок, которые могут произойти во время чтения элемента, а не во время инициализации считывателя.

Поэтому, если вы действительно хотите написать модульный тест для такого случая, ваш тест должен попытаться инициализировать читатель с несуществующей таблицей и ожидает ItemStreamException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...