【问题标题】:Spring @Async and the AbstractRoutingDataSourceSpring @Async 和 AbstractRoutingDataSource
【发布时间】: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 值设置。查看支持@AsyncAsyncExecutionInterceptor 的源代码,因为拦截器将其Order 值返回为HIGHEST_PRECEDENCE,所以它在其他任何事情之前都会被解雇。

【问题讨论】:

    标签: multithreading hibernate spring jdbc asynchronous


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2013-02-21
      • 1970-01-01
      相关资源
      最近更新 更多