Java 如何在Netty中使用带有NioDatagramChannel的EventExecutorGroup?
我对Netty是新手,但最近我和NIO一起工作过一段时间。 我正在构建一个UDP服务器,从我尝试过的示例中可以看出,与Java 如何在Netty中使用带有NioDatagramChannel的EventExecutorGroup?,java,netty,nio,datagram,Java,Netty,Nio,Datagram,我对Netty是新手,但最近我和NIO一起工作过一段时间。 我正在构建一个UDP服务器,从我尝试过的示例中可以看出,与NioServerSocketChannel.class不同,当您使用NioDatagramChannel.class时,一旦套接字接受了数据报,您就无法分配EventLoopGroupworkerGroup来处理这些数据报。我的代码基于Netty示例,如下所示: public class PositionServer { int port; public P
NioServerSocketChannel.class
不同,当您使用NioDatagramChannel.class
时,一旦套接字接受了数据报,您就无法分配EventLoopGroup
workerGroup
来处理这些数据报。我的代码基于Netty示例,如下所示:
public class PositionServer {
int port;
public PositionServer(int port) {
this.port = port;
System.out.println("Port set to " + this.port);
}
public void run() {
EventLoopGroup bossGroup = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(bossGroup).channel(NioDatagramChannel.class)
.handler(new PositionServerHandler());
System.out.println("Binding to port " + port);
bootstrap.bind(port).sync().channel().closeFuture().await();
} catch (InterruptedException e) {
bossGroup.shutdownGracefully();
e.printStackTrace();
}
}
public static void main(String[] args) {
new PositionServer(4000).run();
}
}
这非常好,现在PositionServerHandler
只是将消息输出到控制台
我想将消息推送到数据库中,它们是JSON字符串,所以我想首先将它们转换为JSON。我不想在bossGroup
中执行此操作,因为它会阻塞数据库访问和JSON处理。但我看不到添加workerGroup
的明显方法
谷歌搜索也没有透露太多,除了我的workerGroup
在这种情况下可能应该是EventExecutorGroup
而不是EventLoopGroup
,但我甚至不能100%肯定这一点
在NIO中,我将有两个线程池,我将使用某种队列,一个线程池将字符串推送到队列中,另一个线程池将从队列中取出字符串,将它们转换为JSON对象并推送到数据库中
我可以在Netty做类似的事情吗
在这种情况下,myPositionServerHandler.class
将接受构造函数中的队列,并将整个Datagrampackes
或消息内容推送到队列中,然后让另一个EventLoopGroup
/EventExecutorGroup
获取这些消息并将它们推送到数据库中。
由于某种原因,ServerBootstrap
似乎无法处理NioDatagramChannels
,这对我来说毫无意义
这是否可行?我是否错过了一些显而易见的解决方案
我可以在Netty做类似的事情吗
对。但首先要澄清术语。在典型的TCP服务器示例中,“boss组”是TCP接受的事件循环组。“工作组”是TCP接收的事件循环组。由于UDP套接字不“接受”,但它们确实接收,所以boss组和worker组之间的区别毫无意义,在引用的示例中,该变量仅称为“group”。它执行与典型TCP服务器中的“工作组”相同的功能,即处理传入数据
请记住,单个NioEventLoopGroup包含一个线程池,可以将其配置为具有任意数量的线程
在NIO中,我将有两个线程池,并使用某种队列
您可以使用相同的设计。毕竟,您仍然在使用NIO——您只有Netty可以帮助您。NioEventLoop“worker”组是将字符串推送到队列的“第一”线程池。使用标准JavaAPI或第二个未连接到任何通道的netty事件循环组,以任何方式创建第二个线程池。其他一切都一样。太好了!我仍然不明白为什么工作组与UDP无关,这是因为它是无状态的吗?这是否意味着您可以继续在该线程中工作,因为不可能接收额外的数据?如果没有,那么为什么不像TCP套接字那样使用BossGroup和WorkerGroup呢。如果我每秒接收到1000个UDP数据包,那么拥有一个bossGroup和一个workerGroup是否有意义?我的意思是,这就是我用我的线程池和队列所做的事情,对吗?对不起,我不清楚。您的服务器将有一个工作组。我的意思是,在TCP中,老板组和工人组之间的区别并不适用。我已经更新了答案,希望澄清一下。您可能想提及epoll传输中提供的
SO\u REUSEPORT
,它允许用户以多线程方式为单个UDP端口提供服务。