我有一个包含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,但未能找到相应的功能。
答案 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。