Netty:writeAndFlush通道未来监听器回调函数何时执行?

4

我是netty的新手,正在尝试理解writeAndFlush方法的channel future如何工作。考虑在netty客户端上运行以下代码:

final ChannelFuture writeFuture = abacaChannel.writeAndFlush("Test");
writeFuture.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture future) throws Exception {
        if (writeFuture.isSuccess()) {
            LOGGER.debug("Write successful");
        } else {
            LOGGER.error("Error writing message to Abaca host");
        }
    }
});

这个 writeFuture 的 operationComplete 回调函数是在什么时候被执行的?

  1. 在 netty 将数据交给操作系统的发送缓冲区后(或者)

  2. 在操作系统将数据写入网络套接字之后。(或者)

  3. 在服务器实际接收到这些数据之后。

TIA

1个回答

4
1. After netty hands over the data to the OS send buffers (or)

当从ChannelOutboundBuffer(Netty的发送缓冲区)中删除data时,会通知监听器。


@loxiu - 如果服务器接收到数据,那么就没有通知吗?如果接收方被阻止了怎么办?我该如何检测到这一点呢? - tsar2512
是的,没有通知(或应用程序级别的确认)。如果接收者被阻止,则发送方的操作系统缓冲区将变满,然后Netty无法发送数据,通道的可写性将变为false。 - louxiu
发送方的Tcp发送通常会被限制(减慢),如果接收方很慢或者被阻塞。这是否也会影响Netty发送呢?还是在尽可能快地发送数据后,通道只是变得不可写? - tsar2512
我已经在Stack Overflow上添加了一个问题以获得一些澄清,也许您可以在那里添加答案? http://stackoverflow.com/questions/42750075/understanding-netty-channel-buffers-and-watermarks - tsar2512
@louxiu -- 对于每个writeAndFlush()操作,我们需要在运行时创建并添加一个监听器,这样是否太昂贵了?如何理解这一点? - zipper
@zipper 我认为仅针对计数的监听器并不昂贵。无论如何,您可能需要对其进行分析。 - louxiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接