如何用Netty链接几个ChannelFuture对象?

时间:2017-02-21 13:49:10

标签: java asynchronous netty

我有一个包含ip / port信息的hashmap和一条必须发送到整个列表的消息。 所以我决定创建一个接受hashmap和消息的小方法并执行此操作。它看起来像这样:

public static ChannelFuture sendMessageTo(Map<JsonElement, JsonObject> list, String message) {
        Set<JsonElement> keys = list.keySet();
        for (JsonElement key : keys) { //iterate through the map
            ChannelInboundHandler[] handlers = {
                    new MessageCompletenessHandler(),
                    new MessageRequest(message),
            };
            JsonObject identity = list.get(key);
            ChannelFuture f = connectWithHandler(identity.get("ip").getAsString(), identity.get("port").getAsInt(), handlers); //to the following ip/port send message and return ChannelFuture
        }
        return result; //here result should be a ChannelFuture that when .addListener is added it should be called only when ALL the ChannelFuture-s from the for loop have finished(a.k.a. all messages have been sent)
}

评论应该清楚地说明情况。 问题是如何实现此ChannelFuture结果。 我知道我可以.sync()使用ChannelFuture-s,但这会破坏异步网络的目的。

P.S。:我本质上希望拥有此处描述的功能https://twistedmatrix.com/documents/16.2.0/api/twisted.internet.defer.DeferredList.html,但未能找到相应的功能。

1 个答案:

答案 0 :(得分:0)

一般来说,你想要实现的并不是非常正确的异步方式。但是,netty有一个实用类来完成这类任务 - DefaultChannelGroupFuture.java。但是它是包私有的,仅用于DefaultChannelGroup.java,它确实执行了您在代码中描述的内容。因此,您可以轻松复制此DefaultChannelGroupFuture并使用它。更具体一点:

Collection<ChannelFuture> futures = ArrayList<ChannelFuture>();
...
 //here you add your futures
 ChannelFuture f = connectWithHandler(identity.get("ip").getAsString(), identity.get("port").getAsInt(), handlers); 
 futures.add(f);
...

DefaultChannelGroupFuture groupOfFutures = new DefaultChannelGroupFuture(futures, executor);
if (groupOfFutures.sync().isSuccess()) {
}

请记住,您需要根据需要更改DefaultChannelGroupFuture。