我正在我的项目中使用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。

其他提示

您能否在HTTP服务器的前面放置反向代理,以确保您只允许已知的好请求通过?清漆,鱿鱼还是阿帕奇?

或敲一些东西 码头 这样它是反向代理?

另一种方法是抓住 源代码 在固定版本中,重命名类和软件包,以使其适合您的项目,使类公开,然后使用该实现。

您是否可以使用7(B94)?然后,您可以比较来源,并查看是否可以通过覆盖或提供不同的登录器来修复它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top