我正在编写一个服务器,我想在其中处理来自不同工作线程中的客户端的消息。
在我的入站处理程序的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);
}
}
}
答案 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));
}
}
}