Playframework 如何在游戏中的承诺中使用Http.Context.current()?
在Play Framework 2.2.2中,我想回报一个承诺。但是,我调用的函数需要访问Http.Context.current()中存储的变量(当前登录用户,JPA连接…) 当然,由于承诺是在另一个线程中执行的,因此它没有访问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
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())
。非常感谢你!