2013-05-26 32 views

回答

-1

不,它不是一個錯誤,但是不關閉通道的最佳方式,我想你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搜索與上述類似的東西。

1

如果您在寫入之後使用.close()關閉通道,則根據消息的長度,創建競爭條件,其中所有數據都將寫入,一半數據甚至無數據。

發生這種情況是因爲所有寫入的消息都會進入隊列,並且取決於當前線程是否爲Netty線程,它會處理數據目錄或僅返回。

因爲在大多數情況下,你只希望所有的寫操作後關閉通道已完成,你應該寫你的反應時,使用下面的代碼:

ctx.writeAndFlush(protocolSpecificPacket) 
    .addListener(ChannelFutureListener.CLOSE); 

雖然這始終工作,你並不總是有訪問最後一次寫入,在這些情況下,您還可以發送一個空的ByteBuf,然後將偵聽器添加到:

ctx.writeAndFlush(Unpooled.EMPTY_BUFFER) 
    .addListener(ChannelFutureListener.CLOSE);