如何在Play中的Promise中使用Http.Context.current()?

时间:2014-04-21 13:25:53

标签: playframework playframework-2.2

在Play Framework 2.2.2中,我想返回一个Promise。但是我正在调用一个需要访问Http.Context.current()中存储的变量的函数(当前登录用户,JPA连接......)。

当然,由于Promise是在另一个线程中执行的,因此它无法访问Http.Context.current()。我可以将它保存在Promise中,还是应该手动恢复?我应该使用另一种模式吗?

示例:

public static Promise<Result> getAvailableServices() {
    return new Promise.promise(new Function0<Result>(){
        @Override
        public Result apply() throws Throwable {
            // Long operation
            List<Services> data = buildResult();
            // Render the template
            // (The header of the template requires access to 
            // Http.Context.current().args.get("usermodel"))
            return Results.ok(services_template.render(services));
        }
    });
}

1 个答案:

答案 0 :(得分:5)

是的,HttpExecutionContext就是您所需要的。

创建HttpExecutionContextgets the current thread's Http.Context and stores it。然后,当HttpExecutionContext稍后用于执行代码it restores the Http.Context时。

All Promise methods use an HttpExecutionContext wrapped around the default ExecutionContext所以他们应该跨线程正确地传播Http.Context

例如,上面的示例代码应该可以正常工作。但是,您确实需要确保在调用 getAvailableServices时,Http.Context在您正在调用的主题中可用。如果在调用方法时Http.Context不可用,那么HttpExecutionContext将无法从该线程捕获Http.Context并在promise Function0为{{1}}时传播它应用