2015-10-16 73 views
0

我試圖實現使用Netty作爲通信協議的分佈式actor模型 - 具有TCP連接的NIO版本。假設我們有2個節點(機器),每個節點都有Netty的服務器實例,將傳入的消息傳遞給該節點上的角色。 我想保持同一對遠程參與者的消息排序,所以我的解決方案是使用異步writeAndFlush方法向遠程節點和參與者發送消息 - 當另一個消息需要在第一個消息發送之前發送給同一個參與者,我會將它添加到緩衝區,並使用writeAndFlush消息的回調,從緩衝區處理下一個。它看起來像這樣:Netty - writeAndFlush和消息訂購

channel.writeAndFlush(message).addListener(new MessageListener(mailboxOfSelector)); 

回調方法是:

@Override 
    public void operationComplete(ChannelFuture future) throws Exception { 

     Queue<RemoteMessage> unsentToMailbox = unsentMessages.get(mailboxOfSelector); 

     if (!unsentToMailbox.isEmpty()) { 
      RemoteMessage message = unsentToMailbox.poll(); 
      channel.writeAndFlush(message).addListener(this); 
     } 
    } 

因此,如果A和B是與通道連接2個服務器的實例,我們從A發送 - >乙 - 我的問題是: isSuccess標誌意味着什麼?什麼時候回調實際返回?

當它在A上的最後一個處理程序結束時還是實際上它被傳遞到B上的第一個處理程序時它會返回嗎?

回答

0

Netty5. Version alpha2。在將數據刷新到socketchannel後,Netty再回調operationComplete方法。在這種情況下,這並不意味着數據到達客戶端。這意味着所述數據已被髮送到TCP協議stack.You可以在源代碼中看到這些:

io.netty.channel.ChannelOutboundBuffer.java 

它將調用從remove()方法或remove(Cause cause)promise.trySuccess(),女巫可以觸發operationComplete()方法。