Понимание декораторов в Армерии - PullRequest
0 голосов
/ 19 марта 2020

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

Я реализовал 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 Ответ

3 голосов
/ 20 марта 2020

В 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;
}
...