工作者在netty 4穿线

时间:2014-05-29 10:51:44

标签: java multithreading netty

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

在我的入站处理程序的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);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

正如vanOekel所说,&#34; channelRead0()&#34;已经使用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));
         }
     }
}