Spring Batch: onWriteError в ItemWriteListener не будет достигнут на org.springframework.dao.DuplicateKeyException при реализации средства записи на шаге - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь перехватить элементы, которые не удалось вставить в базу данных из-за нарушения уникального ключа. После «повсеместного» исследования это обескураживающе начинает ощущаться как нефиксированная ошибка или что-то в этом роде. Честно говоря, мне нужно полезное разъяснение.

Редактировать: Посетил здесь , чтобы пропустить исключения, захваченные с помощью @OnSkipInWrite, и это либо недостаточно ясно, либо просто не будет работать.

@Bean
public PersonFailureLoggerListener loggerListener() {
    return new PersonFailureLoggerListener();
}

@Bean
public Step step1(JdbcBatchItemWriter<Person> writer) throws MalformedURLException {
    return stepBuilderFactory.get("step1")
            .<Person, Person>chunk(10)
            .reader(reader())
            .faultTolerant().skipPolicy(fileVerificationSkipper())
            .processor(itemProcessor())
            .writer(writer)
            //.listener(new PersonWriteListener())
            .listener(loggerListener().asItemProcessListener())
            .build();
}

Поддержка слушателя элемента:

@Component
public class PersonFailureLoggerListener extends ItemListenerSupport<Person, Person> {

private static final Logger LOG = LoggerFactory.getLogger(Person.class.getSimpleName().concat(".error"));

@Override
public void afterProcess(Person i, Person o) {
    LOG.info("before: {}, after: {}", i.toString(), o.toString());
}

@Override
public void onWriteError(Exception excptn, List<? extends Person> list) {
    LOG.debug("list[{}] threw write exception", list.size(), excptn);
}

@Override
public void onReadError(Exception excptn) {
    LOG.debug("encountered error on read", excptn);
}

public ItemProcessListener<Person, Person> asItemProcessListener() {
    return this;
}
}

Обновление PersonFailureLoggerListener:

@OnSkipInWrite
public void onSkipInWrite( Person skippedItem, Exception exception ){
    LOG.debug("skipped person: {}", skippedItem.toString());
}

1 Ответ

0 голосов
/ 03 марта 2020

Редактировать: сюда заходили пропущенные исключения, захваченные с помощью @OnSkipInWrite, и это либо недостаточно ясно, либо просто не сработает.

Ответ предлагает использовать SkipListener, но вы здесь регистрируется ItemProcessListener:

.listener(loggerListener().asItemProcessListener())

Это два разных слушателя, которые вызываются в разные моменты жизненного цикла шага. Для прослушивания пропущенных предметов необходимо зарегистрировать SkipListener:

class MySkipListener extends SkipListenerSupport {
    @Override
    public void onSkipInWrite(Object item, Throwable t) {
        // TODO do something with skipped items
    }
}

@Bean
public Step step() {
    return stepBuilderFactory.get("step")
            // .. step config
            .listener(new MySkipListener())
            .build();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...