春天@Async和AbstractRoutingDataSource

我已经使用大获成功的AbstractRoutingDataSource过,但在一个问题击中我不能解析:当我揭开序幕使用异步方法@Async ,它失去了本地线程的上下文,我想不通的地方设置数据库上下文切换。 通常我做的一个方面或在HandlerInterceptor ,但@Async不会通过任何与通常的路线走。 是否有一个拦截器或者类似的东西我可以配置火在非同步调用的开始和结束,这样我可以设置数据库环境?

发现了春天留言板类似的问题。 没有回答,但: http://forum.springsource.org/showthread.php?83792-Async-annotated-method-hanging-on-session-scoped-bean

编辑:我调试的执行流程,并AbstractRoutingData源实际上是在获取调用的异步线程,但纵横前的获取调用获取调用,因此DataSource在Hibernate会话已经设置前的 ThreadLocal值越来越设置。 综观的源代码AsyncExecutionInterceptor ,它备份@Async ,因为它的拦截返回其Order价值HIGHEST_PRECEDENCE ,所以它的任何事情之前被解雇。

春天@Async和AbstractRoutingDataSource


--------------解决方案-------------

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

分类:多线程 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.326 (s). 10 q(s)