Как отловить исключения транзакций в @Async?

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

Пример:

public class UpdateService {
    @Autowired
    private CrudRepository<MyEntity> dao;

    //throws eg ObjectOptimisticLockingFailureException.class, cannot be caught
    @Async
    @Transactional
    public void updateEntity {
        MyEntity entity = dao.findOne(..);
        entity.setField(..);
    }
}

Я знаю, что могу поймать @Async исключения в общем следующие:

@Component
public class MyHandler extends AsyncConfigurerSupport {
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (ex, method, params) -> {
            //handle
        };
    }
}

Но я бы предпочел обрабатывать данное исключение ТОЛЬКО по-другому, если оно происходит внутри UpdateService,

Вопрос: как я могу поймать его внутри UpdateService?

Это единственный шанс: создание дополнительного @Service это оборачивает UpdateService и имеет try-catch блок? Или я мог бы сделать лучше?

1 ответ

Вы можете попробовать самостоятельно ввести свой компонент, который должен работать с Spring 4.3. Хотя самоинъекция, как правило, не очень хорошая идея, это может быть одним из вариантов использования, которые являются законными.

@Autowired
private UpdateService self;

@Transactional
public void updateEntity() {
    MyEntity entity = dao.findOne(..);
    entity.setField(..);
}

@Async
public void updateEntityAsync(){
    try {
       self.updateEntity();
    } catch (Exception e) {
        // handle exception
    }
}
Другие вопросы по тегам