簡體   English   中英

如何在Netty中將EventExecutorGroup與NioDatagramChannel一起使用?

[英]How can I use an EventExecutorGroup with an NioDatagramChannel in Netty?

我是Netty的新手,但是最近我與NIO合作。 我建立一個UDP服務器,它從我試過,不像例子似乎NioServerSocketChannel.class ,當您使用NioDatagramChannel.class你不能分配EventLoopGroup workerGroup來處理數據報后,他們已經被接受插座。 我的代碼基於Netty QuoteOfTheMoment服務器示例,如下所示:

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中進行bossGroup因為它將阻止數據庫訪問和JSON處理。 但是我看不到添加workerGroup的明顯方法。

Googling也沒有透露太多信息,只是在這種情況下,我的workerGroup可能應該是EventExecutorGroup而不是EventLoopGroup ,但是我什至不確定100%。

在NIO中,我將有兩個線程池,並且我將使用某種隊列,一個線程池會將Strings推入隊列,另一個線程池從隊列中獲取Strings,將其轉換為JSON對象並將其推入數據庫。

我可以在Netty中做類似的事情嗎?

在這種情況下,我的PositionServerHandler.class將在構造函數中接受隊列,然后將整個DatagramPackets或消息內容推送到該隊列,然后讓另一個EventLoopGroup / EventExecutorGroup接收這些消息並將其推送到數據庫。 看來, ServerBootstrap不處理NioDatagramChannels出於某種原因,這並沒有什么意義了我。

這可行嗎? 我是否缺少一些明顯的解決方案?

我可以在Netty中做類似的事情嗎?

是。 但是首先要澄清術語。 在典型的TCP服務器樣本中,“老板組”是TCP接受的事件循環組。 “工人組”是TCP接收的事件循環組。 由於UDP套接字不“接受”,但它們確實接受,所以老板組和工作組之間的區別是沒有意義的,在引用的示例中,變量僅稱為“組”。 它在典型的TCP服務器中執行與“工作組”相同的功能,即處理傳入的數據。

請記住,單個NioEventLoopGroup包含一個線程池,可以將其配置為具有任意數量的線程。

在NIO中,我將有兩個線程池,並且會使用某種隊列...

您可以使用相同的設計。 畢竟,您仍在使用NIO-您只有Netty可以為您提供幫助。 NioEventLoop“工作者”組是您的“第一個”線程池,該線程池將字符串推入隊列。 使用標准Java API或使用未附加到任何通道的第二個netty事件循環組,以任意方式創建第二個線程池。 其他所有內容保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM