Domanda

Sto usando com.sun.net.httpserver.HttpServer nel mio progetto. Tuttavia, sembra che il server perde le connessioni quando si arriva i dati non validi dalla connessione HTTP. Il bug è questa:

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

Ora, questo è segnalato per essere risolto nella versione "7 (B94)" -. Tuttavia, stiamo ancora usando Java 1.6 ed è improbabile che vorremmo versioni dell'interruttore di Java, a questo punto

Quindi, io sono alla ricerca di modi per risolvere questa situazione. Non ho un sacco di tempo, quindi preferirei soluzioni rapide che il lavoro per ora, su reimplementare un sacco di cose per dopo.

Ho un paio di idee su come andare su questo:

  • Aggiorna per una più recente Java -. Questa è una cosa che non voglio fare
  • Trova un vaso che contiene solo una versione più recente di com.sun.net.httpserver e assicurarsi che i carichi jar prima i barattoli di sistema.
  • trovare un rimpiazzo per com.sun.net.httpserver -. Sono aperto a puntatori qui
  • Modifica il codice per lavorare con un altro server HTTP integrato, si spera uno che non è troppo diverso da quello attuale. Posso riscrivere il codice di configurazione del server, un po ', ma la maggior parte delle interfacce dovrebbe rimanere lo stesso.
  • decompilare il codice categoria com.sun.net.httpserver.ServerImpl, fissare i luoghi offendere, e ricompilazione quella singola classe per un barattolo di un proprio

Ma, io sono aperto a buoni suggerimenti!

Grazie in anticipo.


Fix è ora implementato e lavora. Io incollare qui i bit rilevanti se qualcun altro ha bisogno di questi:

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);
}
È stato utile?

Soluzione

posso capire la vostra riluttanza a effettuare l'aggiornamento a una build pre-release di Java 7.

Qui sono i miei suggerimenti:

  • Ottenere un contratto di supporto Java da Oracle e portarli a fornire con una patch per Java 6 che fissa il bug.

  • Scarica i sorgenti Java 6 per il rilascio che si sta utilizzando, backport il bug fix dalle fonti di Java 7 e costruire. Forse hai solo bisogno di fare una build di determinati file JAR.

  • guardare il codice e vedere se si potrebbe sviluppare una soluzione. Ad esempio, si potrebbe essere in grado di utilizzare la reflection per scavare la "lista dei HttpConnection istanze" che i colloqui di rapporto bug circa, e rimuovere periodicamente le voci che sembrano sono morti. (Mi piacerebbe trattare questa come ultima risorsa.)


(Ultimo aggiornamento: 2012-05-15)

E, ora che Java 7 è veramente bene e rilasciato (siamo ora a 1.7u4):

  • l'aggiornamento a Java 7, e

  • sbarazzarsi dei hack riflettenti brutto che hai usato come soluzione temporanea.

Altri suggerimenti

Potrebbe mettere un fronte reverse proxy del server HTTP, per essere sicuri di solo permetterà noto buone richieste a venire fino in fondo? Varnish o Squid o Apache?

o colpire qualcosa in Jetty in modo che agisce come un proxy inverso?

Un altro approccio sarebbe quello di afferrare il codice sorgente della versione fissa, rinominare la classe e pacchetto in modo che si adatta al tuo progetto, rendere il pubblico di classe, e quindi utilizzare tale implementazione, invece.

Non si ha accesso a 7 (B94)? Quindi è possibile confrontare le fonti e vedere se è possibile risolvere il problema eseguendo l'override o la fornitura di diverse funzioni di accesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top