@Async 中的异常

DBC 579 0

@Async 方法不会向调用线程抛出异常。这意味着您需要在 @Async 方法中正确处理异常,否则它们将丢失。

错误示范

@Service
public class EmailService {

    @Async
    public void sendEmail() throws Exception{
        throw new Exception("Oops, cannot send email!");
    }
}

@Service
public class PurchaseService {
    
    @Autowired
    private EmailService emailService;

    public void purchase(){
        try{
            emailService.sendEmail();
        }catch (Exception e){
            System.out.println("Caught exception: " + e.getMessage());
        }
    }
}
温馨提示

在上面的代码中,异常在 asyncMethod() 中抛出,但不会被调用线程捕获,并且 catch 块不会被执行。

为了正确处理 @Async 方法中的异常,我们可以结合使用 Futuretry-catch 块。

正确示范

@Service
public class EmailService {

    @Async
    public Future<String> sendEmail() throws Exception{
        throw new Exception("Oops, cannot send email!");
    }
}

@Service
public class PurchaseService {

    @Autowired
    private EmailService emailService;

    public void purchase(){
        try{
            Future<String> future = emailService.sendEmail();
            String result = future.get();
            System.out.println("Result: " + result);
        }catch (Exception e){
            System.out.println("Caught exception: " + e.getMessage());
        }
    }
}
温馨提示

通过返回 Future 对象并使用 try-catch 块,我们可以正确处理和捕获 @Async 方法中引发的异常。

发表评论 取消回复
表情 图片 链接 代码

分享