Как отловить исключения транзакций в @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
}
}