播放2.x和多租户

时间:2014-02-26 16:05:07

标签: java asynchronous playframework-2.0 multi-tenant

我正在使用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不起作用。

有什么建议吗?

谢谢,

0 个答案:

没有答案