java - 了解 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)
您的代码中返回并不能保证请求已被完全处理。
要在请求完全处理后执行特定操作,您需要向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;
}
推荐阅读
- java - 需要帮助了解 NullPointerException
- sql - 针对 Excel 工作表的 SQL 查询不起作用
- python - Pandas - H:M:S 字符串格式的数学运算
- javascript - Websocket php SSL连接Apache2 2.4
- sql - 前一个(未知)日期的 SQL 值
- c++ - 无法使用 glibc-2.17 在 CentOS 7 上运行 uWebSockets
- oracle12c - ORA-01017: 无效的用户名/密码;可插入数据库上的登录被拒绝
- python - 如何将 Pandas 条件格式导出到 Excel 文件
- python - 如何将tickercode添加到每个日期
- android - 权限关闭和活动重新创建后没有更新视图