在服务器处理程序中,我有以下方法:private void writeResponse(HttpObject currentObj, ChannelHandlerContext ctx) throws Exception { Promise<String> promise = client.run(); // client.run() will return a promise // the promise contains the result string I need for http response. promise.sync(); // this method sends http response back, promise.getNow() is the content for the response. writeResponse(currentObj, ctx, promise.getNow()); }client此方法是在从客户端(在代码中)获取一些数据后发送响应。当我使用浏览器对此进行测试时,我确实得到了响应内容。但是,当我将其更改为:private boolean writeResponse(HttpObject currentObj, ChannelHandlerContext ctx) throws Exception { Promise<String> promise = client.run(); promise.addListener(new FutureListener<String>() { @Override public void operationComplete(Future<String> future) throws Exception { if (future.isSuccess()) { writeResponse(currentObj, ctx, future.getNow()); // (1) } else { writeResponse(currentObj, ctx, "FAILED"); } } });}它不再起作用了。据我了解,它认为第二个也应该起作用,因为我已经确认代码确实进入了 (1) 块(if (future.isSuccess())块)。但是我在浏览器中没有得到任何响应。谁能解释一下或指出一些参考资料?我在文档中找到了await()和之间的比较,addListener但它让我感觉两者在功能上彼此相似。
1 回答
弑天下
TA贡献1818条经验 获得超8个赞
问题是你只是调用write(...)
你的ChannelFutureListener
而不是writeAndFlush(...)
. 因此,您的写入数据将永远不会刷新到套接字。
channelReadComplete(...)
可能会在执行之前触发,ChannelFutureListener
因此您最终会遇到这种情况。
所以让它writeAndFlush(...)
在监听器中简短使用。
添加回答
举报
0/150
提交
取消