2015-06-30 4 views
1

Согласно this, чтобы определить Writability канала мы можем назвать channel.isWritable, а затем записать в канал, если он был Writable.Нетти - запись в канал, пока не будет доступен для записи

т.е:

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 после каждой записи?

Спасибо.

ответ

4

Данные на самом деле записываются в основной сокет, если вы вызываете flush(). Поэтому, если вы никогда не назовете flush(), это будетWritable() будет продолжать возвращать false до тех пор, пока вы не увидите OOME. Всякий раз, когда вы вызываете флеш(), зависит от вас и зависит от того, сколько вы хотите буферизировать, прежде чем пытаться выполнить флеш и т. Д.

+0

спасибо. см. мой ответ. – FaNaJ

0

Большое вам мистера Маурера.

Я заканчиваю с этим:

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(); 
     } 
    }); 
} 

Я бы признателен за любые другие рекомендации.

Смежные вопросы