Interface ChannelGroup

  • All Superinterfaces:
    java.util.Collection<Channel>, java.lang.Comparable<ChannelGroup>, java.lang.Iterable<Channel>, java.util.Set<Channel>
    All Known Implementing Classes:
    DefaultChannelGroup

    public interface ChannelGroup
    extends java.util.Set<Channel>, java.lang.Comparable<ChannelGroup>
    A thread-safe Set that contains open Channels and provides various bulk operations on them. Using ChannelGroup, you can categorize Channels 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 Channels

    If you need to broadcast a message to more than one Channel, you can add the Channels 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 ServerChannels and non-ServerChannels exist in the same ChannelGroup, any requested I/O operations on the group are performed for the ServerChannels 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 ChannelInboundHandlerAdapter {
         @Override
         public void channelActive(ChannelHandlerContext ctx) {
             // closed on shutdown.
             allChannels.add(ctx.channel());
             super.channelActive(ctx);
         }
     }