Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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
Java 如何在Netty中使用带有NioDatagramChannel的EventExecutorGroup?_Java_Netty_Nio_Datagram - Fatal编程技术网

Java 如何在Netty中使用带有NioDatagramChannel的EventExecutorGroup?

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

我对Netty是新手,但最近我和NIO一起工作过一段时间。 我正在构建一个UDP服务器,从我尝试过的示例中可以看出,与
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做类似的事情吗

在这种情况下,my
PositionServerHandler.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端口提供服务。