【发布时间】:2015-05-25 10:50:54
【问题描述】:
我是 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,但我什至不能 100% 确定这一点。
在 NIO 中,我将有两个线程池,并且我会使用某种队列,一个线程池会将字符串推送到队列中,另一个将从队列中获取字符串,将它们转换为 JSON 对象并推送他们到数据库。
我可以在 Netty 中做类似的事情吗?
在这种情况下,我的PositionServerHandler.class 将在构造函数中接受一个队列,并将整个DatagramPackets 或消息内容推送给它,然后让另一个EventLoopGroup/EventExecutorGroup 接收这些消息并推送它们到数据库。
似乎 ServerBootstrap 不处理 NioDatagramChannels 出于某种原因,这对我来说没有意义。
这可行吗?我是否缺少一些明显的解决方案?
【问题讨论】: