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

标签 java mysql multithreading netty

我们开发了一个基于 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/

相关文章:

MySQL 集群节点特定硬件

java - KNIME 报告工具

java - 为什么继承输出是意外的

java - 程序在给定所有变量的情况下无法正确计算

c# - 如何将在线程 X 中创建的 WPF 对象传递给线程 Y?

multithreading - 映射用户级线程和内核级线程

c# - 在多线程工作队列处理器中管理 ThreadPool 饥饿?

java - 文件中的 JUnit 测试

java - DbUnit Java仅在一次测试中禁用FOREIGN_KEY_CHECKS

php - 如何在 ORM 查询中混合 OR 和 AND