Понимание декораторов в Армерии
Я только начинаю работать с армерией и изо всех сил пытаюсь полностью понять некоторые вещи.
Я реализовал DecoratingHttpServiceFunction
для предоставления запросов к службе с сеансом Hibernate.
@Override
public HttpResponse serve(HttpService delegate, ServiceRequestContext ctx, HttpRequest req) {
... // setup session for the request context
HttpResponse response = delegate.serve(ctx, req);
... // close session
return response;
}
Но, очевидно, сеанс закрывается до того, как служба действительно будет вызвана и запрос будет возвращен из delegate.serve
это пример DeferredHttpResponse
. Мой подход совершенно неверен или есть лучший способ делать то, что я хочу делать?
1 ответ
В Armeria все запросы и ответы обрабатываются асинхронно. Следовательно, возвращаясь изdelegate.serve(ctx, req)
в вашем коде не гарантирует, что запрос был полностью обработан.
Чтобы выполнить определенное действие после полной обработки запроса, вам необходимо добавить обратный вызов вHttpResponse
вернулся delegate.serve(ctx, req)
:
@Override
public HttpResponse serve(HttpService delegate, ServiceRequestContext ctx, HttpRequest req) {
... // setup session for the request context
HttpResponse response = delegate.serve(ctx, req);
response.whenComplete().handle((unused1, unused2) -> {
... // close session
});
return response;
}