Я пытался использовать noRollback()
, как предложил Кен Чан, но не сработало. Также попробуйте добавить указанные c исключения, но он продолжает выполнять откат.
Условный поток на уровне шага отсутствует на уровне элемента, поэтому он мне не помогает. Также пытался с Слушателями, но документация гласила:
This listener is designed to work around the lifecycle of an item. This means that each method should be called once within the lifecycle of an item and in fault tolerant scenarios, any transactional work that is done in one of these methods would be rolled back and not re-applied. Because of this, it is recommended to not perform any logic using this listener that participates in a transaction.
Я решил свою проблему, используя Tasklet вместо кусочно-ориентированного решения и добавив @Transactional к методу execute тасклета.
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE, noRollbackFor = {
ErrorInternoServidorException.class, SolicitudIncorrectaException.class,
RegistroNoEncontradoException.class, SolicitudEventoObjetaException.class,
SolicitudEventoValidaException.class, MimCargueSolicitudException.class, ConflictException.class,
UnauthorizedException.class, ForbiddenException.class })
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
Ориентированное на фрагменты решение Spring Batch обернуто в тасклет с собственной транзакцией, поэтому я попытался создать новую со своими правилами.
Спасибо всем за ваши ответы. Я многому научился.