我已经使用netty(HttpResponseEncoder + HttpObjectAggregator)实现了一个休息服务,该服务使用json进行回复以获取/发布查询。 我在每次请求后关闭连接时工作正常。 但后来我尝试使用类似
之类的保持活动连接private void writeResult(HttpResponseStatus status, ByteBuf buffer, ChannelHandlerContext ctx) {
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, status, buffer);
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json; charset=UTF-8");
response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
ctx.writeAndFlush(response);
}
在某些负载下,测试系统捕获了一个非常奇怪的案例 - 有时回复是混合的(例如,我们要求实体A / a / 123并接收一些针对entiry B的回复)。例如,我无法使用在浏览器中发送请求来重现它。 一旦我返回关闭连接,所有测试都会通过。
private void writeResult(HttpResponseStatus status, ByteBuf buffer, ChannelHandlerContext ctx) {
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, status, buffer);
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/json; charset=UTF-8");
response.headers().setInt(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE);
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
}
它看起来很奇怪,我预计我的代码中会出现一个错误,但我不明白为什么它只出现在保持活动状态。是否有任何可能出错的提示,以便我可以调试它,因为我是一个新的网络,所以不知道可能是什么原因。
UPD Netty日志的示例错误: https://pastebin.com/7V1trGpS
抱怨 回应身体{" avg":2.30769}!= {"访问":[{"标记":4," visit_at":958104556, "地点":" \ u0417 \ u0430 \ u043c \ u043e \ u043a"}]} (我们返回平均而不是访问列表)。
但是在netty日志中我们可以看到avg被返回请求 GET / locations / 417 / avg?fromAge = 7
并为下一个请求 GET / users / 140 / visit?toDistance = 8 我们返回正确的访问列表。
有些怀疑这些请求是顺序的,但是我已经使用两种不同的检查工具检查了这项服务,并且当禁用keep-alive时,它们都没有看到任何问题。