Frage

Ich verwende com.sun.net.httpserver.HttpServer in meinem Projekt. Allerdings scheint es, dass der Server leckt Verbindungen, wenn es ungültige Daten aus der HTTP-Verbindung bekommt. Der Fehler ist diese:

http://bugs.sun.com/view_bug.do ;? jsessionid = dfe841c3152d878571573bafceb8 bug_id = 6.946.825

Nun, dies wird berichtet, in Version behoben werden „7 (b94).“ - wir sind jedoch nach wie vor mit Java 1.6 und es ist unwahrscheinlich, dass wir Schalter Java-Versionen an dieser Stelle möchten

Also, ich bin auf der Suche nach Möglichkeiten, um diese Situation zu beheben. Ich habe nicht viel Zeit, so dass ich schnelle Lösungen bevorzugen würden, dass die Arbeit jetzt, über für später eine Menge Dinge, die Neuimplementierung.

Ich habe ein paar Ideen, wie um dies zu realisieren:

  • Update auf eine aktuellere Java -. Das ist etwas, was ich will nicht tun
  • Suchen Sie ein Glas, das nur eine neuere Version von com.sun.net.httpserver enthält und stellen Sie sicher, dass jar Lasten, bevor das System Gläser.
  • Finden Sie eine Drop-in-Ersatz für com.sun.net.httpserver. - Ich bin offen für Zeiger hier
  • Ändern Code an der Arbeit mit einem anderen eingebetteten HTTP-Server, hoffentlich eine, die nicht allzu verschieden von dem aktuellen ist. Ich kann den Server-Setup-Code neu schreiben, etwas, aber die meisten der Schnittstellen sollte gleich bleiben.
  • Decompile die com.sun.net.httpserver.ServerImpl Klasse, fixieren die beanstandeten Orten und neu kompilieren, die einzelne Klasse zu einem Glas seine eigene

Aber, ich bin offen für gute Vorschläge!

Vielen Dank im Voraus.


Fix wird nun umgesetzt und arbeitet. Ich werde hier die entsprechenden Bits einfügen, wenn jemand anderes braucht diese:

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);
}
War es hilfreich?

Lösung

Ich kann verstehen, Ihre Abneigung 7 zu einer Pre-Release-Version von Java zu aktualisieren.

Hier sind meine Vorschläge:

  • Hier finden Sie eine Java Support-Vertrag von Oracle und erhalten sie Sie mit einem Patch liefern für Java 6, dass behebt den Fehler.

  • Laden Sie die Java 6 Quellen für die Freigabe Sie derzeit verwenden, zurückzuportieren die Bug-Fix aus der Java 7 Quellen und zu bauen. Vielleicht brauchen Sie nur einen Build von bestimmten JAR-Dateien zu tun.

  • Blick auf den Code und sehen, ob Sie eine Abhilfe entwickeln könnte. Zum Beispiel könnten Sie in der Lage sein Spiegelbild zu verwenden, um die „Liste der Httpconnection-Instanzen“ zu graben, dass die Bug-Report spricht, und in regelmäßigen Abständen Einträge zu entfernen, die aussehen wie sie tot sind. (Ich würde behandelt dies als letzten Ausweg.)


(Stand: 2012-05-15)

Und jetzt, dass Java 7 ist und auch wirklich freigegeben (wir sind jetzt bei 1.7u4):

  • Upgrade auf Java 7 und

  • Sie sich von der bösen reflektierenden Hacks los, dass Sie als eine vorübergehende Lösung verwendet wird.

Andere Tipps

Könnten Sie einen Reverse-Proxy direkt vor dem HTTP-Server setzen, um sicherzustellen, dass nur Sie gut Anfragen erlaubt bekannt, durch kommen? Lack oder Squid oder Apache?

oder etwas klopfen in Jetty so dass es als ein Reverse-Proxy fungiert?

Ein weiterer Ansatz wäre, die

Haben Sie den Zugriff auf 7 (b94) haben? Dann können Sie die Quellen vergleichen und sehen, ob Sie sie durch zwingende oder Bereitstellung unterschiedlicher Zugriffs beheben können.

scroll top