Netty ChannelFuture表现

时间:2016-03-02 15:06:53

标签: netty

我有一段代码检查ChannelHandlerContext WriteandFlush是否成功(确保在发送下一条消息之前已成功发送消息)

    logger.debug("Writing '" + message + "' to channel now");
    ctx.writeAndFlush(message.getMessage());

    ChannelFutureListener cfl = new ChannelFutureListener() {
      @Override
      public void operationComplete(ChannelFuture future) throws Exception {
        if (future.isSuccess()) {
          // Message was successfully sent
          logger.debug("Message '" + message + "' sent successfully");

我遇到的问题是在writeandflush之后,operationComplete只需要一秒钟,这就是我的服务器性能上升。 有谁知道为什么这么长时间?

在继续之前以这种方式检查writeandflush的成功是否是最佳做法?

1 个答案:

答案 0 :(得分:1)

在异步框架中处理消息的最佳方法就是发送消息。 Netty会处理这些消息,并按正确的顺序到达。

调用ChannelFutureListener之前需要这么长时间的原因是因为Netty只会在write + flush完全成功时调用它。发生这种情况时,会发生以下情况:

  1. 您致电writeAndFlush
  2. Netty将其写入底层管道(快速)
  3. Netty冲洗整个管道(快速)
  4. 如果数据已到达另一个端点,则刷新返回成功,这可能需要一些时间
  5. 然后你的听众被称为
  6. 这种方法的优点在于,您知道对方在调用侦听器时已完全接收到数据,并且可以安全地调用此时关闭的方法。

    如果要将多个数据包发送到同一个连接,而不是调用重复的writeAndFlush,则应该为每个数据包调用write,然后在发送flush()之后发送{{1}}最后一个数据包,这样所有的pckets都会被同时处理。