大家。我测试了一些简单的例子,但是发现如果我在启动NIOServer时将工作线程池大小设置为固定2,那么尝试连接netty服务器和另外2个tcp连接(连接而不是关闭),我发现第3和第3 +连接可以连接服务器,但写操作被阻止,注意进入我的处理程序。只有当我关闭第一个或第二个连接时,第三个写入请求才能进入我的处理程序,而且我的管理员什么都不做,只打印helloworld。
主要代码:
ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newSingleThreadExecutor(),
Executors.newFixedThreadPool(2)));
bootstrap.setPipelineFactory(new DispatchServerPipeLineFactory());
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.bind(new InetSocketAddress(8080));
只有一个处理程序代码:
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
System.out.println("hello");
super.messageReceived(ctx, e);
}
任何人都可以帮助我吗? 我必须使用Executors.newCachedThreadPool()?
答案 0 :(得分:2)
使用Executors.newChachedThreadPool()并在NioServerSocketChannelFactory的构造函数中指定worker cound,一切都会正常工作。
答案 1 :(得分:0)
您已经设置了一个包含两个线程的固定线程池,以便在第二个线程之后所有提交的作业将等待一个线程空闲。然后,您将创建两个连接,这两个连接使用这两个线程。然后,您将创建第三个连接。所以它等待。这就是你告诉它要做的事情。如果您不想这样做,请分配更多线程,或者使用不同的线程池,具体取决于您实际想要发生的事情,而您尚未告诉我们。
答案 2 :(得分:0)
实际上,在使用Netty时,您可以将数据处理任务分配给ServerHandler。您需要NioEventLoopGroup侦听客户端连接,并需要EventExecutorGroup进行操作(接收数据并管理如何处理)。这样,传入的连接将不会被阻塞。但可能受到以下代码段的限制。
ServerBootstrap()。childOption(ChannelOption.SO_BACKLOG,10)
有关更多信息,您可以访问以下链接: worker Group vs handler Thread in Netty