了解 Armeria 中的装饰器

Understanding Decorators in Armeria

我刚刚开始使用 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 的一个实例。我的方法是完全错误的还是有更好的方法来做我想做的事情?

在 Armeria 中,所有请求和响应都是异步处理的。因此,在您的代码中从 delegate.serve(ctx, req) 返回并不能保证请求已被完全处理。

要在 请求完全处理后执行特定操作,您需要向 delegate.serve(ctx, req) 返回的 HttpResponse 添加回调:

@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;
}