【问题标题】:Netty putting concurrent requests on queueNetty 将并发请求放入队列
【发布时间】:2016-05-19 15:49:17
【问题描述】:

我的 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(),);

                    }

                })

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

【问题讨论】:

  • 单线程是什么意思?全单线程?只有你的处理程序单线程?有一个服务器主线程?
  • 我的意思是只有一个线程一直在处理请求,当然可能还有另一个线程会监听并将线程放入队列。

标签: java server netty


【解决方案1】:

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

你需要为此定义另一个EventLoopGroup变量,这个变量将是我们的单线程执行器组,所以我们将线程数设置为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 所做的那样

【讨论】:

  • 谢谢,但是并发请求会被放入队列吗?
  • 如果请求进来的速度比处理程序处理它们的速度快,它们将被放入 netty 内部的队列中,直到有时间处理它们,netty 不会说明任何有关订单的信息请求来了,但你可以确定 messageRecievedconnectionInactive 之前被调用
  • 对不起,我可能对此不清楚。我并不完全希望处理程序是单线程的,我通常希望同时处理一个请求,其他请求应该堆叠在队列中,直到该进程的所有操作完成。
  • 如果您在处理程序的 messagerecieved 方法中进行处理,那么您会得到相同的结果。请记住,使用队列更难,因为您还必须考虑停止服务器,而使用 netty 则为您完成
猜你喜欢
  • 2023-04-04
  • 2018-08-12
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 2019-12-05
  • 2016-01-25
  • 1970-01-01
  • 2021-01-13
相关资源
最近更新 更多