记一次遇到@Async异步方法运行异常后导致数据未更改问题

        主线程上有@Transactional注解,并且调用了异步方法,在异步方法执行过程中遇到数据库连接异常,因为异步线程发生的异常,主线程无法捕获,所以未进行事务回滚。

关于线程的两个接口Callable与Runnable之间的区别:

        Callable.call()接口相较于Runnable.run(),是带有返回值并抛出异常,所以想捕获子线程的异常可以通过Callable接口进行实现。

    public static final <T> T submit(Callable<T> task, long timeout) {
        CustomFutureTask<T> future = (CustomFutureTask<T>) executor.submit(task);
        
        try {
            return (T) future.get(timeout, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            try {
                future.cancel(true);
            } catch (Exception ex) {
                /* ignore */
            }
            
            throw new TaskException(e.getMessage());
        }
    }

        对于线程池来说,ThreadPoolTaskExecutor有两种执行线程任务的方法:execute()和submit()。

        execute()没有返回值,所以无法判断任务是否成功完成,对应的线程类实现Runnable接口。        

        submit()有返回值,返回一个Future,对应的线程类实现Callable接口。Future.get()可以阻塞主线程,从而判断子线程任务的执行结果,且可以抛出异常。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值