2016-03-02 50 views
0

我有一段代碼來檢查,如果該ChannelHandlerContext WriteandFlush成功的Netty的ChannelFuture性能

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"); 

我的問題是該operationComplete被(以確保消息已被髮送下一個消息之前發送成功) writeandflush之後花費了一秒多的時間,這會導致我的服務器性能下降。 有人知道爲什麼這麼長時間?

最好的做法是在繼續之前檢查writeandflush的成功嗎?

回答

1

在異步框架中處理消息的最好方法就是發送它們。 Netty將負責處理這些消息並使它們按正確的順序到達。

在調用ChannelFutureListener之前需要很長時間的原因是因爲Netty只會在寫入+ flush完全成功時調用它。發生這種情況時,會發生以下情況:

  1. 你叫writeAndFlush
  2. 的Netty它寫入底層的管道(快速)
  3. 了Netty刷新整個管道(快速)
  4. 沖洗回報的成功,如果該數據已經到達另一個端點,這可能需要一些時間
  5. 那麼你的聽衆被稱爲

的advantag這種方法的一個好處就是你知道你的對方已經完全接收到了監聽者被調用時的數據,並且在那個時刻它可以安全地調用close。

如果您希望將多個數據包發送到同一個連接,而不是調用重複writeAndFlush,你應該改爲調用write爲每個數據包,然後在最後一個數據包後發送flush()調用,這樣所有pckets將被同時處理。