繁体   English   中英

Play Framework 2.6 Java 异步会话和 HTTPExecutionContext

[英]Play Framework 2.6 Java Async Session and HTTPExecutionContext

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

在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM