在使用 @Async 时,我遇到了 spring + hibernate Multi-Tenancy 问题:无法解析当前租户,因为它存储在 ThreadLocal 中,该 ThreadLocal 未继承到线程(由某些 TaskExecutor 提供)。有这方面的经验吗?
提前致谢! 埃尔文
最佳答案
我刚刚看到你的问题。我面临着完全相同的问题,我提出了以下解决方案,这可能不是最好的,但目前它足以完成我的任务。
我在这里采纳了这个想法How to enable request scope in async task executor我稍微修改了它,因为它不能正常工作以满足我的需要。
我所做的是:
- 像上面的链接一样创建一个 TenantAwareThreadPoolExecutor;
- 创建TenantAwareCallable(它将有一个私有(private)字符串tenantName,而不是RequestAttributes(按照您已经做的方式进行操作))。
- 创建一个单例组件,用于存储您从请求中获取的当前租户。
- 将您需要在可调用对象的 call() 方法中使用的租户保存并清除到此组件中。
- 现在,您必须更改 CurrentTenantIdentifierResolver 以从该单例获取租户(检查请求后,否则其他请求将使用与该请求相同的租户)。
请注意:只有当您以队列方式逐个执行任务时,这才有效。如果您同时执行一些操作,则此方法将不起作用。
任何改进的想法都会被接受。
关于spring - Spring 中的 Hibernate Multi-Tenancy 和异步执行(通过 @Async、@Scheduled 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40888047/