Spring中的Hibernate Multitenancy和异步执行(通过@Async,@ Scheduled等)

时间:2016-11-30 12:11:16

标签: spring hibernate spring-mvc asynchronous multi-tenant

使用@Async时遇到spring + hibernate multitenancy的问题:当前的租户无法解析,因为它存储在ThreadLocal中,而ThreadLocal没有继承到该线程(由某些TaskExecutor提供)。有这方面的经验吗?

提前致谢! 欧文

1 个答案:

答案 0 :(得分:1)

我刚看到你的问题。我面临着同样的问题,我提出了以下解决方案,这可能不是最好的,但目前这对我的任务来说已经足够了。

我已经在How to enable request scope in async task executor采取了这个想法,我稍微修改了它,因为它无法满足我的需求。

我做的是:

  1. 像上面的链接一样创建一个TenantAwareThreadPoolExecutor;
  2. 创建TenantAwareCallable(它将拥有一个私有的字符串tenantName而不是RequestAttributes(以你已经的方式接受它)。)
  3. 创建一个单例组件,用于存储您从请求中获得的当前租户。
  4. 保存并清除此组件中您需要在可调用的call()方法中使用的租户。
  5. 现在,您必须更改CurrentTenantIdentifierResolver以从该单例中获取租户(在检查请求之后,否则其他请求将使用与该租户相同的租户)。
  6. 请注意:只有在队列样式中一个接一个地执行任务时,这才会起作用。如果你同时执行某些方法,这种方法将无效。

    任何改进的想法都将被接受。