【问题标题】:Play Framework 2.6 Java Async Session and HTTPExecutionContextPlay Framework 2.6 Java 异步会话和 HTTPExecutionContext
【发布时间】:2017-10-03 07:37:52
【问题描述】:

我正在使用 Play 2.6.3,并且我最近从 Play 2.5.x 升级。 我在使用 sessionHTTPExecutionContext 操作缓存时遇到问题,因为新的 Play 2.6.x 使用 EhCache

在 Play 2.5 中,通过以下方式获取或更新缓存非常简单:

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.

任何帮助将不胜感激。

【问题讨论】:

    标签: java caching playframework


    【解决方案1】:

    你必须使用注入到Controller中的执行上下文:

    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 的形式注入到控制器中的。

    【讨论】:

    • 很抱歉没有发布我完整的控制器代码。但是我已经在控制器中注入并初始化了 HTTPExecution 上下文和缓存
    • 当我在 lookUpUser 函数中使用会话时,它只会抛出 No HTTP Execution Context Available
    猜你喜欢
    • 2018-02-23
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2013-06-18
    • 2019-03-06
    相关资源
    最近更新 更多