【发布时间】:2011-11-11 15:11:55
【问题描述】:
我一直在使用AbstractRoutingDataSource 并取得了巨大的成功,但遇到了一个我无法解决的问题:当我使用@Async 启动异步方法时,它会丢失本地线程的上下文,我可以不知道设置数据库上下文切换的位置。通常我会在一个方面或HandlerInterceptor 中执行此操作,但@Async 不会通过任何这些通常的路线。是否有一个拦截器或类似的东西可以配置为在异步调用的开始和结束时触发,以便我可以设置数据库上下文?
在 Spring 留言板上发现了一个类似的问题。但是没有答案:http://forum.springsource.org/showthread.php?83792-Async-annotated-method-hanging-on-session-scoped-bean
编辑:我已经调试了执行流程,并且 AbstractRoutingData 源 is 实际上在异步线程中被调用,但它在调用方面之前被调用,所以 DataSource已在 Hibernate 会话之前设置 ThreadLocal 值设置。查看支持@Async 的AsyncExecutionInterceptor 的源代码,因为拦截器将其Order 值返回为HIGHEST_PRECEDENCE,所以它在其他任何事情之前都会被解雇。
【问题讨论】:
标签: multithreading hibernate spring jdbc asynchronous