2015-10-16 6 views
0

Я пытаюсь реализовать модель распределенного актера, которая использует Netty в качестве протокола связи - версию NIO с TCP-соединениями.Netty - writeAndFlush и порядок сообщений

Допустим, у нас есть 2 узла (машины), каждый из которых имеет экземпляры сервера Netty, которые передают входящие сообщения субъектам на этом узле. Я хотел бы сохранить порядок сообщений для одной и той же пары удаленных участников, поэтому моим решением было использовать асинхронный метод writeAndFlush для отправки сообщений удаленному узлу и актеру - когда другому сообщению нужно отправить другому участнику до того, как был доставлен первый , Я бы добавил его в буфер и с обратным вызовом сообщения 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); 
     } 
    } 

Так что если А и В 2 экземплярах сервера, связанные с каналом, и мы вышли из A -> B - мой вопрос будет: что означает флаг isSuccess в глубине? и когда действительно возвращается обратный вызов?

Он возвращается, когда он заканчивается последним обработчиком на A или фактически, когда он доставляется первому обработчику на B?

ответ

0

Netty5. Version alpha2. после сброса данных в socketchannel, Netty затем обратится к методу operationComplete. В этом случае доза не означает, что данные доходят до клиента. Это означает, что данные были отправлены в протокол TCP stack.You может видеть их в исходном коде:

io.netty.channel.ChannelOutboundBuffer.java 

Он будет называет promise.trySuccess() от remove() метода или remove(Cause cause), ведьма может вызвать метод operationComplete().

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