为了账号安全,请及时绑定邮箱和手机立即绑定

Netty:使用 sync() 和 addListener() 的区别

Netty:使用 sync() 和 addListener() 的区别

PIPIONE 2022-06-23 10:04:37
在服务器处理程序中,我有以下方法: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(...)在监听器中简短使用。


查看完整回答
反对 回复 2022-06-23
  • 1 回答
  • 0 关注
  • 295 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信