如果在寫入響應後立即關閉通道,會發生什麼情況?答覆是否仍然提供?在寫入響應後立即關閉通道
這http upload example似乎說,但我不知道這只是一個錯誤。
writeResponse(ctx.channel());
ctx.channel().close();
如果在寫入響應後立即關閉通道,會發生什麼情況?答覆是否仍然提供?在寫入響應後立即關閉通道
這http upload example似乎說,但我不知道這只是一個錯誤。
writeResponse(ctx.channel());
ctx.channel().close();
不,它不是一個錯誤,但是不關閉通道的最佳方式,我想你writeResponse這樣進行:
ctx.channel().write(msg)
它asynchronisly發送actuallay消息將提供一個writeBufferQueue,寫入IO線程將被喚醒以進行實際寫入。
檢查由ctx.channel()。write(msg)返回的ChannelFuture
,您可以等待該對象。
的最好辦法關閉網狀通道,我想,應該是:
ctx.channel().write(a emptybuffer).addFutureListener(Channels.CloseFuture);
,因爲使用的是網狀4.0,你可以neeed搜索與上述類似的東西。
如果您在寫入之後使用.close()
關閉通道,則根據消息的長度,創建競爭條件,其中所有數據都將寫入,一半數據甚至無數據。
發生這種情況是因爲所有寫入的消息都會進入隊列,並且取決於當前線程是否爲Netty線程,它會處理數據目錄或僅返回。
因爲在大多數情況下,你只希望所有的寫操作後關閉通道已完成,你應該寫你的反應時,使用下面的代碼:
ctx.writeAndFlush(protocolSpecificPacket)
.addListener(ChannelFutureListener.CLOSE);
雖然這始終工作,你並不總是有訪問最後一次寫入,在這些情況下,您還可以發送一個空的ByteBuf
,然後將偵聽器添加到:
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
.addListener(ChannelFutureListener.CLOSE);