[英]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.