问题原因:导致上述异常主要诱因是@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