了解 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;
}
我刚刚开始使用 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;
}