Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
Spring 如何设置UDP webflux服务器的线程数?_Spring_Spring Boot_Netty_Spring Webflux - Fatal编程技术网

Spring 如何设置UDP webflux服务器的线程数?

Spring 如何设置UDP webflux服务器的线程数?,spring,spring-boot,netty,spring-webflux,Spring,Spring Boot,Netty,Spring Webflux,我正在用Webflux 2.1.8在Spring Boot 2.1.3中构建一个UDP服务器,它从UDP客户端收集数据 我希望它以完全被动的方式构建,但我面临着线程池的问题。我的应用程序目前只在一个线程上运行,这不是我所期望的。首先,我构建了一个简单的python客户端,它等待响应来测试我的服务器 #在客户端创建UDP套接字 UDPClientSocket=socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM) #使用创建的UDP套

我正在用Webflux 2.1.8在Spring Boot 2.1.3中构建一个UDP服务器,它从UDP客户端收集数据

我希望它以完全被动的方式构建,但我面临着线程池的问题。我的应用程序目前只在一个线程上运行,这不是我所期望的。首先,我构建了一个简单的python客户端,它等待响应来测试我的服务器

#在客户端创建UDP套接字
UDPClientSocket=socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM)
#使用创建的UDP套接字发送到服务器
UDPClientSocket.sendto(bytesToSend,serverAddressPort)
打印(“接收…”)
msgFromServer=UDPClientSocket.recvfrom(bufferSize)
msg=“来自服务器{}的消息”。格式(msgFromServer[0])
打印(msg)
现在,我的Spring boot UDP服务器如下所示:

@springboot应用程序
公共类演示应用程序{
公共静态void main(字符串[]args){
run(DemoApplication.class,args);
}
@豆子
CommandLineRunner服务器运行程序(UdpDecoderHandler UdpDecoderHandler、UdpEncoderHandler、UdpEncoderHandler、UdpHandler和UdpHandler){
返回字符串->{
创建UDPServer(UDPDecoderhandler、udpEncoderHandler、udpHandler);
};
}
私有void createUdpServer(UdpDecoderHandler UdpDecoderHandler,UdpEncoderHandler UdpEncoderHandler,UdpHandler UdpHandler){
UdpServer.create()
.句柄((输入,输出)->{
in.receive().asByteArray().subscribe();
返回通量。从不();
})
.港口(19001)
.doOnBound(康涅狄格州->康涅狄格州)
.addHandler(“解码器”,udpDecoderHandler)
.addHandler(“编码器”,udpEncoderHandler)
.addHandler(“handler”,udpHandler)
)
.bindNow(持续时间为秒(30));
}
}
解码器:

@服务
公共类UdpDecoderHandler扩展MessageToMessageDecoder{
私有静态最终记录器Logger=LoggerFactory.getLogger(UdpDecoderHandler.class);
@凌驾
受保护的无效解码(ChannelHandlerContext ChannelHandlerContext,DatagramPacket DatagramPacket,列出){
ByteBuf ByteBuf=datagramPacket.content();
字节[]数据=新字节[byteBuf.readableBytes()];
读取字节(数据);
字符串消息=新字符串(数据);
LOGGER.info(“解码数据:”+msg);
InetSocketAddress s=datagramPacket.sender();
channelHandlerContext.fireChannelRead;
}
}
编码器:

@服务
公共类UdpEncoderHandler扩展MessageToMessageEncoder{
@凌驾
受保护的无效编码(ChannelHandlerContext ctx、对象o、列表)引发异常{
InetSocketAddress socketAddress=(InetSocketAddress)o;
调试(“编码函数…”);
String msg=“你好响应!”;
DatagramPacket response=新的DatagramPacket(unmooled.copiedBuffer(msg.getBytes()),socketAddress);
列表。添加(响应);
}
}
Handler(这里我添加了sleep函数来测试我的一致性):

@服务
公共类UdpHandler扩展ChannelInboundHandlerAdapter{
@凌驾
public void channelRead(ChannelHandlerContext ctx,Object msg)引发异常{
日志信息(“通道读取功能”);
InetSocketAddress消息=(InetSocketAddress)消息;
睡眠(5000);
ctx.channel().writeAndFlush(message).addListener((GenericFutureListener)future->{
if(future.isDone()&&future.issucess()){
日志信息(“确定”);
}否则{
log.error(“error”+future.isDone()+“-”+future.issucess());
如果(!future.issucess()){
future.cause().printStackTrace();
}
}
});
}
}
有了这些,我立即运行了python脚本:

python3 udp-client.py & python3 udp-client.py
将弹出两条消息,显示5s的差异,这意味着我的应用程序运行在一个线程上


如何自定义netty和webflux以使用4个线程?

您发现问题了吗?将要实现一个类似的PoC解决方案。不幸的是,没有。我已经手工实现了UDP套接字,它接受传入的连接并手动创建线程。我找到了答案。UDP本质上是在单个线程中运行的,因为它长时间不需要处理任何连接。为每个消息切换到新线程在CPU和内存上都非常昂贵,因为UDP服务器每秒应该有数千个请求。因此,我也实现了我的自定义解决方案,但使用了本机Java net UDP支持和Kotlin协同路由,这可能是我能找到的最快的解决方案。也尝试过对Golang和Rust进行同样的操作。感谢更新,您有公共回购协议供参考吗?