public interface ChannelGroupextends Set<Channel>, Comparable<ChannelGroup>
A thread-safe Set
that contains open Channel
s and provides various bulk operations on them. Using ChannelGroup
, you can categorize Channel
s into a meaningful group (e.g. on a per-service or per-state basis.) A closed Channel
is automatically removed from the collection, so that you don't need to worry about the life cycle of the added Channel
. A Channel
can belong to more than one ChannelGroup
.
Broadcast a message to multiple Channel
s
If you need to broadcast a message to more than one Channel
, you can add the Channel
s associated with the recipients and call write(Object)
:
ChannelGroup recipients =
new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
recipients.add(channelA);
recipients.add(channelB);
.. recipients.write(Unpooled.copiedBuffer(
"Service will shut down for maintenance in 5 minutes.", CharsetUtil.UTF_8));
Simplify shutdown process with ChannelGroup
If both ServerChannel
s and non-ServerChannel
s exist in the same ChannelGroup
, any requested I/O operations on the group are performed for the ServerChannel
s first and then for the others.
This rule is very useful when you shut down a server in one shot:
ChannelGroup allChannels =
new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
public static void main(String[] args) throws Exception { ServerBootstrap b = new ServerBootstrap(..);
...
b.childHandler(new MyHandler());
// Start the server
b.getPipeline().addLast("handler", new MyHandler()); Channel serverChannel = b.bind(..).sync(); allChannels.add(serverChannel);
... Wait until the shutdown signal reception ...
// Close the serverChannel and then all accepted connections. allChannels.close().awaitUninterruptibly();
}
public class MyHandler extends ChannelHandlerAdapter { @Override
public void channelActive(ChannelHandlerContext ctx) {
// closed on shutdown. allChannels.add(ctx.channel());
super.channelActive(ctx);
}
}