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 ChannelGroup.write(Object)
:
ChannelGroup
recipients = newDefaultChannelGroup
(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 = newDefaultChannelGroup
(GlobalEventExecutor
.INSTANCE); public static void main(String[] args) throws Exception {ServerBootstrap
b = newServerBootstrap
(..); ... 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 extendsChannelInboundHandlerAdapter
{@Override
public void channelActive(ChannelHandlerContext
ctx) { // closed on shutdown. allChannels.add(ctx.channel()); super.channelActive(ctx); } }