我所有的控制器都使用我创建的CheckDowntimeAction
。
@Singleton
@With(CheckDowntimeAction.class)
public class MyController extends Controller {
}
按预期,在每个请求上,CheckDowntimeAction
都会显示“我在这里!”。但是如何在CheckDowntimeAction
内部中止操作,以便如果站点关闭,我将返回在CheckDowntimeAction
中创建的自己的结果?
public class CheckDowntimeAction extends play.mvc.Action.Simple {
@Override
public CompletionStage<Result> call(Http.Request req) {
logger.info("I'm here!");
// just move along, nothing to see here
return delegate.call(req);
}
}
这可行,但是它会打印停机时间结果之后 MyController
已经运行完毕。我希望它在控制器完成之前运行 。
public class CheckDowntimeAction extends play.mvc.Action.Simple {
@Override
public CompletionStage<Result> call(Http.Request req) {
if (downtime) {
Result r = badRequest("Site is down");
// before Play 2.7, this would have been:
// return F.Promise.pure(badRequest(r));
return delegate.call(req).thenApply(result -> r);
}
// just move along, nothing to see here
return delegate.call(req);
}
}
请注意,这使用的是Java Play 2.7,它使用请求而不是上下文,并且F.Promise不再可用。参见https://www.playframework.com/documentation/2.7.x/JavaHttpContextMigration27
答案 0 :(得分:0)
根据https://www.playframework.com/documentation/2.5.1/api/java/play/libs/F.Promise.html F.Promise
中的文档已弃用,它表示改为使用CompletableFuture.completedFuture
。 Play 2.7中的更改是F.Promise
最终被完全删除。
我相信正确的Play 2.7方式是:return CompletableFuture.completedFuture(r);