当前位置: 首页 > 知识库问答 >
问题:

IO的netty什么都不做编解码器?

魏熠彤
2023-03-14

我正在编写超文本传输协议-server,它将执行一些非常繁重的计算。我有一些与业务逻辑和阻塞IO相关的编码器-解码器管道。

public void initChannel(Channel ch) { 
    ch.pipeline()
         //All actions in these handlers are very heavy and involve some IO
        .addLast(logicGroup, new HttpRequestDecoder())
        .addLast(logicGroup, new HttpObjectAggregator(Int.MaxValue))
        .addLast(logicGroup, new HttpResponseEncoder())
        .addLast(logicGroup, new ChunkedWriteHandler())
        .addLast(logicGroup, new ResponseBodyDecoder())
        .addLast(logicGroup, new MyBusinessLogic())
}

所以我决定创建另一个工人

EventLoopGroup ioGroup = new NioEventLoopGroup(4)

并在最开始添加简单的处理程序:

.addLast(ioGroup, new ChannelDuplexHandler()) //<---- Only for IO
.addLast(logicGroup, new HttpRequestDecoder())
.addLast(logicGroup, new HttpObjectAggregator(Int.MaxValue))
.addLast(logicGroup, new HttpResponseEncoder())
.addLast(logicGroup, new ChunkedWriteHandler())
.addLast(logicGroup, new ResponseBodyDecoder())
.addLast(logicGroup, new MyBusinessLogic())

在内蒂这样做是不是很通俗?还是有更好的方法?

共有1个答案

段铭晨
2023-03-14

通常,如果要在 IO 线程上运行处理程序,则在向管道添加处理程序时,您不会指定执行器组。我的建议是将管道构建为:

EventExecutorGroup executorGroup = new DefaultEventExecutorGroup(numberOfThreads);

...

public void initChannel(Channel ch) { 
    ch.pipeline()
      .addLast(new HttpRequestDecoder())
      .addLast(new HttpObjectAggregator(Int.MaxValue))
      .addLast(new HttpResponseEncoder())
      .addLast(new ChunkedWriteHandler())
      .addLast(new ResponseBodyDecoder())
      .addLast(executorGroup, new MyBusinessLogic());
}

这将使您的 MyBusinessLogic 在另一个线程中运行,而不会阻塞 IO 线程。如果你的响应体解码器在cpu/或块上也非常重,你也可以在这里使用执行器组

 类似资料:
  • 这是我的第一个JMH基准测试。我可能做错了一切,但是... 我的基准看起来是这样的 是我开始的...等了又等,然后杀了它。我怀疑在< code>@Setup中有问题,所以我简化了它,但是什么都没有改变。这场赛跑开始时相当乐观... 然后什么都没发生。过了很长时间,它继续写下20行像 和5行像 然后它输出一些结果 并更正其估计的eta: 我的是否比我想象的更频繁地被调用,或者还有什么其他原因导致了缓

  • 在Java中,什么与Python的pass等效?我意识到我可以使用continue语句或不完成语句体来实现这种效果,但我喜欢使用pass语句。

  • 我的配置文件是类路径的路径。至少我认为是这样。我放置了log4j。资源文件夹中的属性文件,而log4j对此不做任何处理。即使我删除了它,也不会发生错误。 任何人都可以看到,我在使用maven LoggerTest的内容: 程序输出: log4j的内容。属性: 在波姆。xml并不是什么不同寻常的东西,只是一个依赖组织。阿帕奇。登录中。log4j log4j内核2.17.2,编译器源目标是16,没有插

  • 问题内容: 我有以下定制JPanel,并且已使用Netbeans GUI构建器将其添加到我的框架中,但是背景不会改变!我可以看到用g.fillOval()绘制的圆圈。怎么了? 问题答案: 如果面板“不透明”(透明),您将看不到背景色。

  • 在Windows10中输入以下命令并启动无头chrome版本时,没有发生任何事情(有/没有扩展): 它只是悄悄地返回到命令行,我找不到任何pdf文件。 有人遇到过同样的问题并设法解决了吗? 我正在使用:Google Chrome 63.0.3239.84(官方版本)(64位)(队列:63_Win_84)

  • 因此,我使用javafx创建了这个应用程序,它有一个登录屏幕,但我在这方面没有任何成功,我已经在这个项目的这个小部分工作了一些天,它根本不能以任何方式工作。我尝试这样做,我看了一些教程,其中大部分都是像下面的代码一样,但它对我来说不起作用,如果有人能帮我解释为什么我的标签文本没有改变(这就是我如何测试登录是否成功),这将是很好的,下面是代码: 控制器: FXML格式