首页 > 解决方案 > 了解 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.serveDeferredHttpResponse. 我的方法是完全错误的还是有更好的方法来做我想做的事?

标签: javaarmeria

解决方案


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

推荐阅读