我正在使用Play Framework 2.0实现多租户应用程序。为此,我添加了eban配置两个适配器:
public class TenantBeanQueryAdapter implements BeanQueryAdapter {
...
@Override
public void preQuery(BeanQueryRequest<?> beanQueryRequest) {
Query query = beanQueryRequest.getQuery();
query.where().eq(this.tenantManager.getFieldName(),this.tenantManager.getValue().toString());
}
}
public class TenantBeanPersistController implements BeanPersistController{
...
@Override
public boolean preInsert(BeanPersistRequest<?> request) {
try {
Field field = request.getBean().getClass().getDeclaredField(tenantManager.getFieldName());
field.setAccessible(true);
field.set(request.getBean(),tenantManager.getValue());
return true;
} catch (Exception e) {
return false;
}
}
}
这些适配器从会话中获取租户ID。问题在于Ebean,它使用Futures进行一些查询。 TenantManager从会话中获取tenant_id,会话存储在ThreadLocal中。结果是:
java.lang.RuntimeException: There is no HTTP Context available from here.
我一直在研究,我考虑过ExecutorService和InheritableThreadLocal(这里建议使用propagation),但我认为Play不会让我替换Ebean的backgroundExecutor和InheritableThreadLocal不起作用。
有什么建议吗?
谢谢,