gpt4 book ai didi

java - Netty 服务器挂起不接受任何连接

转载 作者:可可西里 更新时间:2023-11-01 08:49:36 24 4
gpt4 key购买 nike

我们开发了一个基于 Netty(3.5.11) 的 IM 服务器,它使用我们的自定义协议(protocol)。

以下是将处理程序添加到管道的顺序。

objChannelPipeline.addLast("nettyLoggingHandler", objFrameworkLoggingHandler);
objChannelPipeline.addLast("ipFilter", objCustomIPFilterHandler);
objChannelPipeline.addLast("idleHandler", objIdleStateHandler);
objChannelPipeline.addLast("loggingHandler", objLoggingHandler);
objChannelPipeline.addLast("frameDecoder",objDelimiterBasedFrameDecoder);
objChannelPipeline.addLast("messageDecoder", new CustomProtocolDecoderHandler());
objChannelPipeline.addLast("groupOrder", executionHandler);
objChannelPipeline.addLast("ProtocolMultiplexer", objRegistrationHandler);

在我们从从客户端获得的注册消息中找到协议(protocol)后,“ProtocolMultiPlexer”处理程序将替换为合适的“ProtocolHandler”。

ipFilterHandler 会查看 MYSQL 数据库中包含黑名单 IP 的表,并决定是否处理来自远程 IP 的连接。

问题:每隔几天随机数后,服务器停止处理任何消息。我们可以通过执行负载测试并终止与 mysql 服务器的所有连接来重现此问题。当所有 MYSQL 进程都被终止时,除了 boss 线程之外的所有 netty 线程似乎都挂起了。服务器正在接受连接请求,但未对消息进行进一步处理。当我们发现我们没有添加 MYSQL“connectTimeout”和“socketTimeout”值时,我们认为问题已经解决。添加这些值后,我们再次尝试通过终止负载下的所有 MYSQL 进程来重复我们的测试,我们没有发现任何线程进入挂起状态。

在生产中部署具有上述更改的服务器后,我们遇到了类似的错误,但这一次,甚至 boss 线程和所有其他“Netty”线程都进入了挂起状态。唯一可用的线程是来 self 们的 DBPool(http://www.snaq.net/java/DBPool/) 的更干净的线程。没有 Netty 线程记录任何内容,所有线程似乎都挂起。我无法获得线程转储。任何帮助都是可观的

谢谢

最佳答案

Netty 处理程序不应该执行长时间阻塞操作,例如从数据库读取。从一个单独的线程执行,如 http://netty.io/4.0/guide/#faq.4 中所建议的那样

关于java - Netty 服务器挂起不接受任何连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17429306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com