Question

J'utilise com.sun.net.httpserver.HttpServer dans mon projet. Cependant, il semble que le serveur fuites connexions quand il reçoit des données non valides de la connexion HTTP. Le bug est celui-ci:

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

Maintenant, cela devrait être résolu dans la version « 7 (B94). » - cependant, nous utilisons encore Java 1.6 et il est peu probable que nous voulons passer d'une version Java à ce point

Alors, je cherche des moyens de remédier à cette situation. Je n'ai pas beaucoup de temps, donc je préfère des solutions rapides que le travail pour l'instant, sur réimplémentant beaucoup de choses pour plus tard.

J'ai quelques idées sur la façon d'aller à ce sujet:

  • Mise à jour Java plus récente -. C'est quelque chose que je ne veux pas faire
  • Trouver un pot qui ne contient qu'une version plus récente de com.sun.net.httpserver et assurez-vous que les charges de pot avant les pots système.
  • Trouver une solution de remplacement pour com.sun.net.httpserver -. Je suis ouvert à des pointeurs ici
  • Modifier le code de travail avec un autre serveur HTTP embarqué, nous l'espérons un pas trop différent de celui en cours. Je peux réécrire le code de configuration du serveur, un peu, mais la plupart des interfaces doivent rester le même.
  • décompiler la classe com.sun.net.httpserver.ServerImpl, fixer les lieux incriminés, et recompilation cette classe unique à un pot de son propre

Mais, je suis ouvert à de bonnes suggestions!

Je vous remercie à l'avance.


Fix est maintenant mis en œuvre et de travaux. Je vais coller ici les bits pertinents si quelqu'un d'autre a besoin de ces:

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);
}
Était-ce utile?

La solution

Je peux comprendre votre réticence à passer à une version pré-version de Java 7.

Voici mes suggestions:

  • Obtenir un contrat de support Java d'Oracle et les amener à vous fournir un correctif pour Java 6 qui corrigent le bogue.

  • Télécharger les sources Java 6 pour la version que vous utilisez actuellement, rétroporter le correctif de bug à partir des sources Java 7 et construire. Peut-être que vous avez seulement besoin de faire une version de certains fichiers JAR.

  • Regardez le code et voir si vous pouvez développer une solution de contournement. Par exemple, vous pourriez être en mesure d'utiliser la réflexion pour creuser la « liste des HttpConnection cas » que les pourparlers de rapport de bogue, et de supprimer périodiquement les entrées qui regardent comme ils sont morts. (Je traite cela comme un dernier recours.)


(Mise à jour: 2012-05-15)

Et, maintenant que Java 7 est bel et bien sorti (nous sommes maintenant à 1.7u4):

  • mise à niveau vers Java 7 et

  • se débarrasser des méchants hacks réfléchissants que vous avez utilisé comme une solution temporaire.

Autres conseils

Pouvez-vous mettre un Infront proxy inverse du serveur HTTP, pour vous assurer que vous ne PERMETTENT connue de bonnes demandes à venir à travers? Vernis ou Squid ou Apache?

Ou frapper quelque chose dans Jetty de sorte qu'il agit comme un proxy inverse?

Une autre approche serait de saisir l'élément

Avez-vous accès à 7 (B94)? Ensuite, vous pouvez comparer les sources et voir si vous pouvez le réparer en remplaçant ou en fournissant différents accesseurs.

scroll top