2016-09-05 2 views
5

@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을 만드는 것입니까? 아니면 더 잘할 수 있을까요?

답변

1

Spring 4.3과 작동해야하는 콩을 self-injecting 시도해 볼 수 있습니다. 자기 주입은 일반적으로 좋은 생각은 아니지만 합법적 인 유스 케이스 중 하나 일 수 있습니다.

@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 
    } 
} 
+0

실제로 이것은자가 주입을위한 유효한 유스 케이스라면 충분할 수 있습니다. 질문은 : 그렇습니까? – membersound

+0

@ mememound : 내 의견으로는, 그것은 유효합니다. 또한 그것을 잘못 사용하여 1000 개의 줄이있는 "신 클래스"가 될 수도 있습니다. 하지만 예외 처리는이 클래스에만 해당됩니다. 클래스에 넣지 않으시겠습니까? 만약 누군가가 나쁜 습관이라고 여기면, 여기에 의견을 남길 수 있습니다 ... – user140547

+0

그것은 작동하지 않고 실패합니다 :'1 콩 사이에 순환 의존성이 있습니다. ' spring-boot.1.4.0 with spring.4.2.3 – membersound

관련 문제