处理Netty中的SQL查询等长时间任务

时间:2016-05-27 03:44:18

标签: java multithreading model netty

我正在学习Netty,但我无法弄清楚Netty线程。

哪个是IO线程?我在线阅读了一些页面,说明你不能阻止IO线程。但是,我不知道IO线程是哪个。

例如:

 b = new ServerBootstrap(); 
 b.group(bossGroup, workerGroup)
  .channel(NioServerSocketChannel.class) 
  .childHandler(new SimpleChatServerInitializer())  // (4)
  .option(ChannelOption.SO_BACKLOG, 128)            // (5)
  .childOption(ChannelOption.SO_KEEPALIVE, true);   // (6)

WorkGroupbossGroup

1 个答案:

答案 0 :(得分:2)

bossGroup和workerGroup都是为I / O处理提供线程的线程池。 bossGroup线程处理客户端连接请求,并接受连接并为每个客户端创建一个通道。之后,将仅为此通道分配来自workerGroup的线程,该通道可能同时具有入站和出站数据包。对于入站数据包,工作线程将由事件调用,需要读取数据包。对于出站数据包,工作线程需要将它们写入通道套接字缓冲区以进行发送。这就是为什么它们都是I / O线程。

然后准备(从MySQL / MongoDB等持久性存储中获取消息/数据),如果将业务逻辑放入同一个工作线程中,它将被阻塞。在更糟糕的情况下,如果其他通道正在使用/共享相同的工作线程。业务逻辑将阻止可能具有紧急(时间敏感)数据包的其他通道的I / O.这会导致问题。因此,您应该让业务逻辑在不同的线程(例如用户定义的线程)中执行,或者您可以创建一个单独的EventExecutorGroup并让业务逻辑处理程序在该线程组中。

希望以上有所帮助。