Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 对于Netty客户端应用程序,我们可以使用的最佳体系结构是什么?_Multithreading_Netty - Fatal编程技术网

Multithreading 对于Netty客户端应用程序,我们可以使用的最佳体系结构是什么?

Multithreading 对于Netty客户端应用程序,我们可以使用的最佳体系结构是什么?,multithreading,netty,Multithreading,Netty,我需要开发一个基于netty的客户端,它接受来自通知服务器的消息,并将这些消息作为Http请求实时发送到另一台服务器。 我已经编写了一个可以实现这一点的工作应用程序,但我需要在其中添加多线程。 在这一点上,我对如何在多线程程序中处理网络通道感到困惑,因为我都使用了套接字和线程的传统方法 当我试图将烦人的请求部分分离到一个方法中时,它抱怨通道没有关闭。 有人能告诉我怎么处理吗? 我想使用ExecutionHandler和OrderedMemoryAwareThreadPoolExecutor,但我

我需要开发一个基于netty的客户端,它接受来自通知服务器的消息,并将这些消息作为Http请求实时发送到另一台服务器。 我已经编写了一个可以实现这一点的工作应用程序,但我需要在其中添加多线程。 在这一点上,我对如何在多线程程序中处理网络通道感到困惑,因为我都使用了套接字和线程的传统方法

当我试图将烦人的请求部分分离到一个方法中时,它抱怨通道没有关闭。 有人能告诉我怎么处理吗? 我想使用ExecutionHandler和OrderedMemoryAwareThreadPoolExecutor,但我对这方面还很陌生

在这个时候,帮我举一些例子会是一个真正的帮助


提前感谢。

您是否查看了上的示例代码?看起来就像你说的那样。无论何时获得连接,工厂都会创建新的处理程序。每当有新连接时,将使用来自执行器的线程。我怀疑您可以使用任何线程池和执行器:

// Configure the server.
ServerBootstrap bootstrap = new ServerBootstrap(
        new NioServerSocketChannelFactory(
                Executors.newCachedThreadPool(),       << change
                Executors.newCachedThreadPool()));     << change

// Configure the pipeline factory.
bootstrap.setPipelineFactory(new TelnetServerPipelineFactory());

// Bind and start to accept incoming connections.
bootstrap.bind(new InetSocketAddress(8080));
当telnet准备关闭连接时,它会执行以下操作:

ChannelFuture future = e.getChannel().write(response);
if (close) {
    future.addListener(ChannelFutureListener.CLOSE);
}

只需将ExecutionHandler添加到ChannelPipeline。这将确保添加到ExecutionHandler后面的每个ChannelUpstreamHandler都将在一个额外的线程中执行,因此不会阻塞工作线程。

这是不正确的。如果使用nio,则共享线程。所以每个连接都没有新线程
ServerBootstrap
类接受一对线程池,而连接共享线程?你确定@Norman?这似乎不合逻辑。是的,我确定。。我是netty的核心开发者之一;)给定的执行器用于获取所需的线程(boss线程和辅助线程)。默认情况下,工作线程的数量是2*cpu计数。哦,我想我们同意@Norman。使用池外的线程。我并不是说每个连接都创建了一个新线程。为了更好地反映这一点,我调整了答案。当然,使用
newCachedThreadPool
它将创建一个新线程,但只有在必要时。谢谢你的耐蒂!!啊好的。。。看来我误解你了。
ChannelFuture future = e.getChannel().write(response);
if (close) {
    future.addListener(ChannelFutureListener.CLOSE);
}