Понимание декораторов в Армерии

Я только начинаю работать с армерией и изо всех сил пытаюсь полностью понять некоторые вещи.

Я реализовал 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;
}
Другие вопросы по тегам