Spring @Async和AbstractRoutingDataSource

atr*_*ain 6 spring multithreading asynchronous hibernate jdbc

我一直在使用AbstractRoutingDataSource取得了巨大成功,但遇到了一个我无法解决的问题:当我开始使用异步方法时@Async,它会丢失本地线程的上下文,我无法弄清楚要设置的位置数据库上下文切换.通常我会在一个方面或在一个方面HandlerInterceptor,但@Async不会通过任何这些通常的路线.是否有拦截器或类似的东西,我可以配置为在异步调用的开始和结束时触发,以便我可以设置数据库上下文?

在Spring留言板上找到了类似的问题.但是没有答案:http://forum.springsource.org/showthread.php?83792-Async-annotated-method-hanging-on-session-scoped-bean

编辑:我已经调试了执行流程,并且AbstractRoutingData源实际上在异步线程中调用的,但是在调用方面之前调用它,所以在值设置之前DataSource已经在Hibernate会话中设置了.查看源代码,后面的,因为拦截器返回其值,因此它在其他任何东西之前被触发.ThreadLocalAsyncExecutionInterceptor@AsyncOrderHIGHEST_PRECEDENCE

在此输入图像描述

atr*_*ain 3

我想我已经找到了答案:方法执行拦截将无法设置 上的变量ThreadLocal,因为AsyncExecutionInterceptor始终具有更高的优先级并启动 Hibernate 事务。相反,我所做的是将逻辑从异步方法外部化到其自己的类,并通过 将该方法标记为需要其自己的事务@Transactional(propagation=Propagation.REQUIRES_NEW)。由于子方法现在在其自己的事务中运行,因此新 Hibernate 事务开始时ThreadLocal会正确拾取 上的变量。AbstractRoutingDataSource