Все мои контроллеры используют этот 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