如何在@Async中捕获事务异常?

时间:2016-09-05 09:18:31

标签: java spring spring-transactions spring-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内,我更愿意以不同的方式处理给定的异常。

问题:我怎样才能在<{1>}里面

唯一的机会是:创建一个额外的UpdateService来封装@Service并拥有UpdateService块吗?或者我可以做得更好吗?

1 个答案:

答案 0 :(得分:1)

你可以试试self-injecting你的bean,它应该与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
    }
}