gpt4 book ai didi

java - 如何在 Netty 中将 EventExecutorGroup 与 NioDatagramChannel 一起使用?

转载 作者:行者123 更新时间:2023-11-30 03:30:20 24 4
gpt4 key购买 nike

我是 Netty 新手,但最近接触过一些 NIO。我正在构建一个 UDP 服务器,从我尝试过的示例来看,与 NioServerSocketChannel.class 不同,当您使用 NioDatagramChannel.class 时,您无法分配一个EventLoopGroup workerGroup 用于在套接字接受数据报后对其进行处理。我的代码,基于Netty QuoteOfTheMoment server示例如下:

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,但是我什至不能百分百确定这一点。

在 NIO 中,我有两个线程池,我会使用某种队列,一个线程池将字符串推送到队列,另一个线程池将从队列中取出字符串,将它们转换为 JSON 对象并推送将它们存入数据库。

我可以在 Netty 中做类似的事情吗?

在这种情况下,我的 PositionServerHandler.class 将在构造函数中接受一个队列,并将整个 DatagramPackets 推送给它,或者消息内容,然后再有另一个 EventLoopGroup/EventExecutorGroup 获取这些消息并将它们推送到数据库。由于某种原因,ServerBootstrap 似乎无法处理 NioDatagramChannels,这对我来说没有意义。

这可行吗?我是否缺少一些明显的解决方案?

最佳答案

Can I do something similar in Netty?

是的。但首先要澄清术语。在典型的 TCP 服务器示例中,“老板组”是 TCP 接受的事件循环组。 “工作组”是 TCP 接收的事件循环组。由于UDP套接字不“接受”,但它们确实接收,所以boss组和worker组之间的区别是没有意义的,并且在引用的示例中,该变量仅称为“组”。它执行与典型 TCP 服务器中“工作组”相同的功能,即处理传入的数据。

请记住,单个 NioEventLoopGroup 包含一个线程池,可以将其配置为具有任意数量的线程。

In NIO, I would have two thread pools, and I'd use some sort of queue...

您可以使用相同的设计。毕竟你还在使用 NIO - 你只是有 Netty 来帮助你。 NioEventLoop“worker”组是您的“第一个”线程池,它将字符串推送到队列。以任何您想要的方式创建第二个线程池,可以使用标准 Java API,也可以使用未附加到任何 channel 的第二个 netty 事件循环组。其他一切保持不变。

关于java - 如何在 Netty 中将 EventExecutorGroup 与 NioDatagramChannel 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29193460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com