@Async
을 사용하여 트랜잭션 방식을 작성하는 경우 @Transactional
예외를 포착 할 수 없습니다. ObjectOptimisticLockingFailureException
처럼, 트랜잭션 커밋 중에 메서드 자체 외부에서 발생하기 때문에.@Async에서 트랜잭션 예외를 catch하는 방법은 무엇입니까?
예 :
@Component
public class MyHandler extends AsyncConfigurerSupport {
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> {
//handle
};
}
}
을하지만 다른 방법으로 경우에만에서 주어진 예외를 처리하는 것을 선호 것 : 나는 다음과 같이 내가 일반적으로에서 @Async
예외를 잡을 수있어
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(..);
}
}
UpdateService
내에 발생합니다.
질문 : 어떻게하면 을UpdateService
안에 넣을 수 있습니까?
유일한 기회는 을 감싸고 있고 try-catch
블록이있는 추가 @Service
을 만드는 것입니까? 아니면 더 잘할 수 있을까요?
실제로 이것은자가 주입을위한 유효한 유스 케이스라면 충분할 수 있습니다. 질문은 : 그렇습니까? – membersound
@ mememound : 내 의견으로는, 그것은 유효합니다. 또한 그것을 잘못 사용하여 1000 개의 줄이있는 "신 클래스"가 될 수도 있습니다. 하지만 예외 처리는이 클래스에만 해당됩니다. 클래스에 넣지 않으시겠습니까? 만약 누군가가 나쁜 습관이라고 여기면, 여기에 의견을 남길 수 있습니다 ... – user140547
그것은 작동하지 않고 실패합니다 :'1 콩 사이에 순환 의존성이 있습니다. ' spring-boot.1.4.0 with spring.4.2.3 – membersound