Sun Java Httpserver有一个错误,如何修复它?
-
29-09-2019 - |
题
我正在我的项目中使用com.sun.net.httpserver.httpserver。但是,在从HTTP连接获得无效的数据时,服务器似乎泄漏了连接。这个错误是这个:
http://bugs.sun.com/view_bug.do; jsessionId = dfe841c3152d878571573bafceb8?bug_id = 6946825
现在,据报道这是在版本“ 7(B94)”中固定的 - 但是,我们仍在使用Java 1.6,并且在这一点上我们不太可能希望Switch Java版本。
因此,我正在寻找解决这种情况的方法。我没有很多时间,所以我更喜欢现在可以使用的快速解决方案,而不是重新完成很多事情。
我有一些关于如何解决这个问题的想法:
- 更新到最近的Java-这是我不想做的事情。
- 找到一个仅包含Com.sun.net.httpserver的最新版本的JAR,并确保在系统罐之前加载JAR。
- 为com.sun.net.httpserver找到一个替换替换 - 我在这里向指针开放。
- 修改代码以与另一台嵌入式HTTP服务器一起使用,希望与当前该服务器没有太大不同。我可以在某种程度上重写服务器设置代码,但是大多数接口应该保持不变。
- 对com.sun.net.httpserver.serverimpl class进行反复编译,修复了有问题的地方,并将该类重新编译到它自己的一罐中
但是,我愿意接受好建议!
先感谢您。
修复现在已实施并有效。如果其他人需要这些,我会在这里粘贴相关位:
final Field httpserverimpl_server = Class.forName("sun.net.httpserver.HttpServerImpl").getDeclaredField("server");
final Field httpsserverimpl_server = Class.forName("sun.net.httpserver.HttpsServerImpl").getDeclaredField("server");
final Field serverimpl_allconnections = Class.forName("sun.net.httpserver.ServerImpl").getDeclaredField("allConnections");
final Field httpconnection_closed = Class.forName("sun.net.httpserver.HttpConnection").getDeclaredField("closed");
httpserverimpl_server.setAccessible(true);
httpsserverimpl_server.setAccessible(true);
serverimpl_allconnections.setAccessible(true);
httpconnection_closed.setAccessible(true);
Object serverimpl = httpserverimpl_server.get(server);
Set allconnections = (Set)serverimpl_allconnections.get(serverimpl);
LinkedList<Object> toRemove = new LinkedList<Object>();
for (Object conn : allconnections) {
if (httpconnection_closed.getBoolean(conn)) {
toRemove.add(conn);
}
}
for (Object conn : toRemove) {
allconnections.remove(conn);
}
解决方案
我可以理解您不愿升级到Java 7的预发行版本。
这是我的建议:
从Oracle获取Java支持合同,并让它们为您提供解决错误的Java 6的补丁。
为您当前正在使用的版本下载Java 6源,从Java 7来源进行错误修复并构建。也许您只需要构建某些JAR文件即可。
查看代码,看看您是否可以开发解决方法。例如,您也许可以使用反射来挖掘错误报告所谈论的“ HTTPConnection实例列表”,并定期删除看起来像已死的条目。 (我将其视为最后的手段。)
(更新:2012-05-15)
而且,既然Java 7已经很好并且确实发布了(我们现在处于1.7U4):
升级到Java 7,然后
摆脱您用作临时解决方法的令人讨厌的反射hack。
不隶属于 StackOverflow