1

我使用 Netty 编写了一个简单的 UDP 服务器。服务器侦听某个接口上的一个端口。

ChannelFactory factory =
            new NioDatagramChannelFactory(
                    Executors.newCachedThreadPool());

ConnectionlessBootstrap bootstrap = new ConnectionlessBootstrap(factory);

bootstrap.getPipeline().addLast("MyHandler", new TestHandler());

bootstrap.bind(new InetSocketAddress(InetAddress.getByName("192.168.1.100"), 8080));

我使用一个向服务器发送大量 UDP 数据报的客户端。当我使用 VisualVM 分析我的应用程序时,我看到只有一个线程(名为 New I/O worker #1)处理传入的消息。是否符合预期?

如果是,单个线程如何处理大量传入消息?我已经编写了一个带有 Spring 集成的应用程序,它在端口上侦听 UDP 数据报(使用 UDP 入站通道适配器),并且有一个线程在端口上侦听,但该线程将传入消息传递给其他线程进行处理一个水池。

谢谢

4

2 回答 2

1

我建议您将 Reactor 模式与 java.nio 一起使用 - 看看这个-

于 2012-06-20T11:25:30.463 回答
1

你的机器上有多少个内核?

如果您的处理程序管道不进行任何阻塞或任何冗长的处理,则很可能 I/O 处理将始终比网络快很多,即 IO 线程将空闲并等待相当大一部分工作它的时间。无需从池中分配另一个线程。

另一方面,如果您的处理程序涉及冗长的处理或阻塞调用,例如数据库或文件访问,那么您应该将处理交给 ExecutionHandler,它将处理从 IO 工作池转移到另一个线程池。

于 2012-06-20T14:08:29.103 回答