Netty将并发请求放在队列中

时间:2016-02-09 15:27:06

标签: java server netty

我遇到netty问题,我有一台带有FutureChannel和Handlers的服务器

     ServerBootstrap b = new ServerBootstrap();
        b.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    public void initChannel(SocketChannel ch) throws Exception {
                        ch.pipeline().addLast(new MyDecoder(service),new MyHander(),);

                    }

                })

我想让这个服务器成为单线程并将并发请求放入队列,我知道应该可以使用适当的调度程序,但我对此很新,并且不知道如何实现这一点。 谢谢你回答。

1 个答案:

答案 0 :(得分:2)

制作单线程处理程序很简单。

你需要为此目的定义另一个EventLoopGroup变量,这个变量将是我们的单线程exector组,所以我们将线程数设置为1:

EventLoopGroup applicationGroup = new NioEventLoopGroup(1);

然后我们可以在ChannelInitializer中使用此论坛来安排任务,我们会为此目的使用addLast(EventExecutorGroup, ChannelHandler...)

ServerBootstrap b = new ServerBootstrap();
    b.group(bossGroup, workerGroup)
            .channel(NioServerSocketChannel.class)
            .childHandler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new MyDecoder(service))
                    ch.pipeline().addLast(applicationGroup, new MyHander());

                }

            })

使用单独的applicationGroup构建管道后,每个请求都将以单线程方式进入,并且可以使用简单的调试语句确认该行为。这种构造方法的优点是,您可以简单地假设处理程序中有一个线程,同时仍然对多线程协议进行解码并具有高性能。

关闭服务器时,应确保正确终止applicationGroup,就像使用workerGroupbossgroup

一样
相关问题