在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));
}
});
}
答案 0 :(得分:5)
是的,HttpExecutionContext
就是您所需要的。
创建HttpExecutionContext
时gets 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}}时传播它应用