Netty - writeAndFlush和消息排序

时间:2015-10-16 17:35:05

标签: java netty actor

我试图实现使用Netty作为通信协议的分布式actor模型 - 具有TCP连接的NIO版本。

假设我们有2个节点(机器),每个节点都有Netty的服务器实例,它们将传入的消息传递给该节点上的actor。 我想保持每对远程actor的消息排序,所以我的解决方案是使用异步writeAndFlush方法向远程节点和actor发送消息 - 当另一个消息需要在第一个消息发送之前发送给同一个actor时,我会将它添加到缓冲区并使用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是与Channel连接的2个服务器实例,我们从A发送 - >&gt; B - 我的问题是:isSuccess标志的深度意味着什么?什么时候回调实际上会回来?

当它在A上完成最后一个处理程序或者实际上它被传递给B上的第一个处理程序时它会返回吗?

1 个答案:

答案 0 :(得分:0)

Netty5. Version alpha2。在将数据刷新到socketchannel之后,Netty然后回调operationComplete方法。在这种情况下,它并不意味着数据到达客户端。这意味着数据已经发送到TCP协议栈。您可以在源代码中看到这些:

io.netty.channel.ChannelOutboundBuffer.java

它将从promise.trySuccess()方法或remove()调用remove(Cause cause),可以触发operationComplete()方法。