Adr*_*ien 4 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));
}
});
}
Run Code Online (Sandbox Code Playgroud)
是的,HttpExecutionContext是你需要的.
HttpExecutionContext创建一个时,它获取当前线程Http.Context并存储它.然后,当HttpExecutionContext稍后用于执行代码时,它将恢复Http.Context.
所有Promise方法都使用HttpExecutionContext 包装默认的ExecutionContext,因此它们应该Http.Context跨线程正确传播.
例如,上面的示例代码应该可以正常工作.但是,您确实需要确保在调用时 getAvailableServices,Http.Context您在调用的线程中可以使用它.如果在Http.Context调用方法时它不可用,那么HttpExecutionContext将无法捕获该Http.Context线程并在Function0应用promise时传播它.
| 归档时间: |
|
| 查看次数: |
4910 次 |
| 最近记录: |