JPA @Async @Transactional 导致失效 或者 no session 问题

问题原因:导致上述异常主要诱因是@Async 与@Transactional 标记方法在调用过程生成的代理对象并不是同一个对象。

问题现象1:当我们在方法上仅仅标记@Async 注解时,异步生效,但异步线程调用的过程中出现 JPA 框架 报的no session 异常,事务或数 据库会话被提前关闭了

问题1解决方法:因此在该方法同样加上@Transactional 注解标记事务,再调用时不会出现报错no session ,但此时方法的调用又重新变回同步了,@Async 的注解失效了。

问题现象2:由解决问题1解决时再导致@Async 失效

最终解决方法
1、方法上同时加上 @Async @Trasactional 注解,并在应在异步方法中查询数据,不使用上层查找的数据。

 @Async
    @Transactional
    public void sendDeliverMessage(List<ExchangedApplication> lstExchangeApplication, String approvalComments) {
    	//方法内重新查 List<ExchangedApplication> ,尽量不使用上层方法传递的对象
    }

2、apo代理的对象为同一对象
(1)在配置类加入 @EnableAspectJAutoProxy(exposeProxy = true) 注解 暴露代理对象

    @Configuration
	@EnableAsync
	@EnableAspectJAutoProxy(exposeProxy = true) 
	public class AsyncConfig {
	}

(2)方法如过需要调用异步任务,请使用AopContext 去找到当前的代理对象 。

	ExchangedApplicationService service = (ExchangedApplicationService) AopContext.currentProxy();
    service.sendDeliverMessage(lstExchangeApplication,approvalComments); //此为@Async 标记的异步方法

此为原创文章转载请注明出处,感激不尽。
参考文章

https://blog.csdn.net/millery22/article/details/80113873

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值