Netty 4多线程DefaultEventExecutorGroup

时间:2013-07-30 02:21:32

标签: multithreading networking netty

我创建了一个netty4 nio服务器,它有多个业务线程来处理长期业务 如下所示

public void start(int listenPort, final ExecutorService ignore)
        throws Exception {
            ...
    bossGroup = new NioEventLoopGroup();
    ioGroup = new NioEventLoopGroup();
    businessGroup = new DefaultEventExecutorGroup(businessThreads);

    ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, ioGroup).channel(NioServerSocketChannel.class)
            .childOption(ChannelOption.TCP_NODELAY, 
                         Boolean.parseBoolean(System.getProperty(
                                 "nfs.rpc.tcp.nodelay", "true")))
            .childOption(ChannelOption.SO_REUSEADDR, 
                         Boolean.parseBoolean(System.getProperty(
                                 "nfs.rpc.tcp.reuseaddress", "true")))
            .childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch)
                        throws Exception {
                    ch.pipeline().addLast("decoder",
                            new Netty4ProtocolDecoder());
                    ch.pipeline().addLast("encoder",
                            new Netty4ProtocolEncoder());
                    ch.pipeline().addLast(businessGroup, "handler",
                            new Netty4ServerHandler());
                }
            });

    b.bind(listenPort).sync();
    LOGGER.warn("Server started,listen at: " + listenPort + ", businessThreads is " + businessThreads);
}

我发现当服务器接受一个连接时,只有一个线程在工作。 如何引导只能为一个连接启动多个业务线程的服务器?

谢谢, 分钟

1 个答案:

答案 0 :(得分:2)

Netty将始终对一个连接使用相同的线程。这是设计的。如果您想更改此设置,您可以实现自定义EventExecutorGroup,并在将ChannelHandler添加到ChannelPipeline时将其传入。

请注意,这可能会导致数据包混乱。