Playframework 如何在游戏中的承诺中使用Http.Context.current()?

Playframework 如何在游戏中的承诺中使用Http.Context.current()?,playframework,playframework-2.2,Playframework,Playframework 2.2,在Play Framework 2.2.2中,我想回报一个承诺。但是,我调用的函数需要访问Http.Context.current()中存储的变量(当前登录用户,JPA连接…) 当然,由于承诺是在另一个线程中执行的,因此它没有访问Http.Context.current()的权限。我可以在承诺中保留它,还是应该手动恢复它?有没有其他模式我应该使用 例如: public static Promise<Result> getAvailableServices() { return

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

当然,由于承诺是在另一个线程中执行的,因此它没有访问Http.Context.current()的权限。我可以在承诺中保留它,还是应该手动恢复它?有没有其他模式我应该使用

例如:

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));
        }
    });
}
公共静态承诺getAvailableServices(){
返回新承诺。承诺(新函数0(){
@凌驾
public Result apply()抛出可丢弃的{
//长期运行
列表数据=buildResult();
//呈现模板
//(模板的标题需要访问
//Http.Context.current().args.get(“用户模型”))
返回Results.ok(services_template.render(services));
}
});
}

是的,
HttpExecutionContext
是您所需要的

当创建
HttpExecutionContext
时,它将被删除。然后,当以后使用
HttpExecutionContext
执行代码时

因此,它们应该跨线程正确地传播
Http.Context


例如,上面的示例代码应该可以正常工作。但是,您确实需要确保在调用
getAvailableServices
时,
Http.Context
在您调用的线程中可用。如果调用该方法时,
Http.Context
不可用,然后,当应用承诺的
函数0
时,
HttpExecutionContext
将无法从该线程捕获
Http.Context
,并传播它。

这个问题可能被视为对我们可以将另一个参数传递给promise.promise(),ExecutionContext的重写。这是答案的一部分吗?它有效!我使用了
Promise.Promise(…,HttpExecution.defaultContext())
。非常感谢你!