【问题标题】:Worker threads in netty 4netty 4中的工作线程
【发布时间】:2014-05-29 10:51:44
【问题描述】:

我正在编写一个服务器,我想在其中处理来自不同工作线程中客户端的消息。

在入站处理程序的 channelRead0() 中,我收到消息,我想用工作线程处理消息(我的 handleWebSocketFrame 必须在工作线程中执行。)。谁能告诉我怎么做?

public class WebSocketSslServerHandler extends SimpleChannelInboundHandler<Object>
{
    ....

    @Override
    public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception
    {
        if (msg instanceof WebSocketFrame)
        {
            handleWebSocketFrame(ctx, (WebSocketFrame) msg);
        }
    }
}

【问题讨论】:

  • 据我了解,Netty 已经使用工作线程执行了“channelRead0()”方法。您可以调整 Netty 本身来设置可用工作线程的数量,请参阅 this answer 中的 cmets。
  • 很高兴提供帮助,但请验证它是否按预期工作,如果确实如此,请在回答您自己的问题时描述解决方案,以便其他人可以得到相同的见解。

标签: java multithreading netty


【解决方案1】:

正如 vanOekel 所说,“channelRead0()”方法已经由 Netty 使用工作线程执行。 由于我想对每个客户端消息运行一些繁重的操作,我可以在 channelRead0() 中使用 Java 的内置线程池技术。

我还结合了 johnstlr 将线程池的引用传递给 ServerBootstrap 使用的 ChannelInitializer 的想法。然后可以在其构造函数中将其传递给 WebSocketSslServerHandler。

public class WebSocketSslServerHandler extends SimpleChannelInboundHandler<Object>
{
     ExecutorService cachedPool;

     public WebSocketSslServerHandler (ExecutorService pool)
     {
         this.cachedPool = pool;
     }

     @Override
     public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception
     {
         if (msg instanceof WebSocketFrame)
         {
              cachedPool.submit(new MessageHandler(ctx, (WebSocketFrame) msg));
         }
     }
}

【讨论】:

  • 我不知道这是否是故意的,但该代码将为每个 WebSocketFrame 实例创建一个新的线程池。您希望在应用程序启动时创建一次线程池并将任务提交到同一个实例。
  • 正如@johnstlr 指出的那样,或者您可以将EventExecutorGroup 添加到您的处理程序中(查看netty.io/4.0/api/io/netty/channel/ChannelPipeline.html 的文档),然后调用ctx.executor().submit(new MessageHandler(ctx, (WebSocketFrame) msg));
  • 感谢 johnstlr 和 jknair。但我找不到如何将缓存的线程池附加到我的处理程序。我发现它是如何为客户端完成的,但不是为服务器端完成的。你能帮帮我吗?
  • 假设您为每个连接创建服务器端处理程序的实例,您需要将线程池的引用传递给 ServerBootstrap 使用的 ChannelInitializer。然后可以在其构造函数中(或通过其他方式)将其传递给您的处理程序。如果您的处理程序是为所有连接共享的,您需要在创建它时将线程池传递给处理程序。我不确定 jknair 的建议是否同样适用,因为我仍在使用 Netty 3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
相关资源
最近更新 更多