【问题标题】:Netty - write to a channel until it is writableNetty - 写入通道直到它可写
【发布时间】:2015-06-30 11:49:04
【问题描述】:

根据this,判断通道的可写性,我们可以调用channel.isWritable,如果是可写,则写入通道。

即:

private void writeIfPossible(Channel channel) {
    while(needsToWrite && channel.isWritable()) {
        channel.writeAndFlush(createMessage());
    }
}

但是,这个呢:

private void writeIfPossible(ChannelHandlerContext ctx) {
    Channel channel = ctx.channel();
    channel.eventLoop().execute(() -> {
        while (needsToWrite && channel.isWritable()) {
            ctx.write(createMessage(), ctx.voidPromise());
        }
        ctx.flush();
    });
}

这是正确的吗?我的意思是,channel.write(或ctx.write)对频道的可写性有影响吗?或者我们必须在每次写入后调用channel.flush

谢谢。

【问题讨论】:

    标签: java networking netty nio


    【解决方案1】:

    只有调用flush()时,数据才会真正写入底层套接字。因此,如果您从不调用flush(),isWritable() 将继续返回false,直到您看到OOME。何时调用 flush() 取决于您,取决于您在尝试刷新等之前要缓冲多少。

    【讨论】:

      【解决方案2】:

      非常感谢 Maurer 先生。

      我最终得到了这个:

      public void sendMessages(ChannelHandlerContext ctx, RecyclableArrayList messages) {
          Channel channel = ctx.channel();
          channel.eventLoop().execute(() -> {
              int i = 0;
              while (channel.isActive() && channel.isWritable() && i < messages.size()) {
                  for (int j = 0; j < 5 && i < messages.size(); j++, i++) {
                      ctx.write(messages.get(i), ctx.voidPromise());
                  }
                  ctx.flush();
              }
              if (i < messages.size()) {
                  messages.subList(0, i).clear();
                  storeMessages(ctx.name(), messages);
              } else {
                  messages.recycle();
              }
          });
      }
      

      如果有任何其他建议,我将不胜感激。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-09
        • 2023-03-10
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多