[英]Play Framework 2.6 Java Async Session and HTTPExecutionContext
我正在使用 Play 2.6.3,并且最近从 Play 2.5.x 升级。 当新的 Play 2.6.x 使用EhCache
时,我在操作缓存时遇到了session
和HTTPExecutionContext
问题。
在 Play 2.5 中,通过以下方式 getOrUpdate 缓存非常简单:
User currentUser = cache.getOrElse(session("email"), () -> {
User user = User.find.byId(session("email"));
cache.set(user.email, user, Constants.CACHE_TIMEOUT);
return user;
});
这不起作用,因为他们已弃用 getOrElse 方法,而是创建了使用缓存 API 的 getOrElseUpdate 并由 AsyncCacheApi 和 SyncCacheApi 接口定义。 所以,简而言之,新的缓存返回 CompletionStage 而不是直接返回 T。
新玩2.6代码:
CompletionStage<User> maybeCached = cache.getOrElseUpdate(session("email"), () -> lookUpUser());
return maybeCached.thenApplyAsync(op -> {
return ok(views.html.dashboard.render("Dashboard", op, op.organization));
}, httpExecutionContext.current());
public CompletionStage<User> lookUpUser() {
return CompletableFuture.supplyAsync(() -> User.find.byId(session("email")),httpExecutionContext.current());
}
lookUpUser 函数抛出以下错误: java.lang.RuntimeException: There is no HTTP Context available from here.
任何帮助将不胜感激。
您必须使用注入控制器的执行上下文:
https://www.playframework.com/documentation/2.6.x/JavaAsync#Using-HttpExecutionContext
import play.libs.concurrent.HttpExecutionContext;
import play.mvc.*;
import javax.inject.Inject;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
public class MyController extends Controller {
private HttpExecutionContext httpExecutionContext;
@Inject
public MyController(HttpExecutionContext ec) {
this.httpExecutionContext = ec;
}
public CompletionStage<Result> index() {
// Use a different task with explicit EC
return calculateResponse().thenApplyAsync(answer -> {
// uses Http.Context
ctx().flash().put("info", "Response updated!");
return ok("answer was " + answer);
}, httpExecutionContext.current());
}
private static CompletionStage<String> calculateResponse() {
return CompletableFuture.completedFuture("42");
}
}
因此,请检查您的httpExecutionContext
正是作为HttpExecutionContext
注入控制器的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.