Allow to receive a ChannelGroupFuture that will be notified once all Channels are closed.

Motivation:

It's useful to be able to be notified once all Channels that are part of the ChannelGroup are notified. This can for example be useful if you want to do a graceful shutdown.

Modifications:

- Add ChannelGroup.newCloseFuture(...) which will be notified once all Channels are notified that are part of the ChannelGroup at the time of calling.

Result:

Easier to be notified once all Channels within a ChannelGroup are closed.
This commit is contained in:
Norman Maurer 2015-06-05 12:44:55 +02:00
parent ffdf00e301
commit 3308510bc9
2 changed files with 36 additions and 0 deletions

View File

@ -223,4 +223,16 @@ public interface ChannelGroup extends Set<Channel>, Comparable<ChannelGroup> {
* the operation is done for all channels * the operation is done for all channels
*/ */
ChannelGroupFuture deregister(ChannelMatcher matcher); ChannelGroupFuture deregister(ChannelMatcher matcher);
/**
* Returns the {@link ChannelGroupFuture} which will be notified when all {@link Channel}s that are part of this
* {@link ChannelGroup}, at the time of calling, are closed.
*/
ChannelGroupFuture newCloseFuture();
/**
* Returns the {@link ChannelGroupFuture} which will be notified when all {@link Channel}s that are part of this
* {@link ChannelGroup}, at the time of calling, are closed.
*/
ChannelGroupFuture newCloseFuture(ChannelMatcher matcher);
} }

View File

@ -339,6 +339,30 @@ public class DefaultChannelGroup extends AbstractSet<Channel> implements Channel
return new DefaultChannelGroupFuture(this, futures, executor); return new DefaultChannelGroupFuture(this, futures, executor);
} }
@Override
public ChannelGroupFuture newCloseFuture() {
return newCloseFuture(ChannelMatchers.all());
}
@Override
public ChannelGroupFuture newCloseFuture(ChannelMatcher matcher) {
Map<Channel, ChannelFuture> futures =
new LinkedHashMap<Channel, ChannelFuture>(size());
for (Channel c: serverChannels.values()) {
if (matcher.matches(c)) {
futures.put(c, c.closeFuture());
}
}
for (Channel c: nonServerChannels.values()) {
if (matcher.matches(c)) {
futures.put(c, c.closeFuture());
}
}
return new DefaultChannelGroupFuture(this, futures, executor);
}
@Override @Override
public int hashCode() { public int hashCode() {
return System.identityHashCode(this); return System.identityHashCode(this);