【问题标题】:Netty: ctx.channel().writeAndFlush(out) not working when data is being sent from thread other than Netty's worker threadNetty:当从 Netty 的工作线程以外的线程发送数据时,ctx.channel().writeAndFlush(out) 不起作用
【发布时间】:2021-01-12 14:05:06
【问题描述】:

我在我的一个项目中使用 Netty。有一个流程,我必须从其他线程(其他 netty 的工作线程)向客户端发送一些数据:

final ChannelFuture writeAndFlushFuture = ctx.channel().writeAndFlush(out)
                        .addListener(new GenericFutureListener<Future<? super Void>>() {
                            @Override
                            public void operationComplete(Future<? super Void> future) throws Exception {
                                LOGGER.info("=========> dsgdsfgdsfgdfsgdfsgsdgfd");
                            }
                        });

此外,我正在等待客户端收到我的有效负载后的响应。我也将超时与它相关联,因此每当客户端未在时间范围内回复时,我都会从服务器关闭上下文(假设连接错误)。

发生了一些奇怪的事情。每当我将有效负载发送到客户端时,我的日志中都没有打印出来

dsgdsfgdsfgdfsgdfsgsdgfd

但是,由于超时,它会在我关闭连接之前打印出来。我不确定我做错了什么,没有立即发送有效负载,而是在关闭连接之前。

这里会发生什么?

【问题讨论】:

  • 想要再添加 1 条信息,如果我直接在工作线程上发送有效负载(从 InboundHandler 中),则会发送有效负载。但是当我把这个逻辑包装在CompletableFuture.runAsync(/*send payload*/)

标签: java netty


【解决方案1】:

实际上,当我将对象写入上下文时,缺少一个刷新:

ctx.writeAndFlush(commands);

现在,它工作正常。但奇怪的是,它在 Netty 的工作线程中执行时工作正常,即使没有刷新。

【讨论】:

  • 您需要执行 flush() 以“保证”写入实际上会写入套接字。
猜你喜欢
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
相关资源
最近更新 更多