Chiudere il molo usando ShutdownHandler

Sto usando http://www.eclipse.org/jetty/documentation/current/shutdown-handler.html come guida per provare a chiudere il mio server jetty, ma sto diventando java.net.SocketException: Unexpected end of file from server quando connection.getResponseCode(); si chiama e non so perché. Sto usando un server configurato xml, quindi il modo in cui ShutdownHandler viene aggiunto alla catena del gestore è un po ‘diverso, ma dovrebbe andare bene. So che ShutdownHandler è correttamente collegato alla catena del gestore perché ho usato dumpAfterStartup per verificare se è stato avviato.

La cosa di cui sono più sicuro è la linea: URL url = new URL("http://localhost:" + port + "/shutdown?token=" + shutdownCookie); . Non so cosa dovrei inserire nel campo shutdownCookie; la password specificata in ShutdownHandler, o il tasto STOP, o cosa. Ho provato sia la password che il tasto STOP senza fortuna. Sto usando POST come metodo di richiesta, ma ho provato anche PUT e non funziona neanche.

Si prega di chiedere maggiori informazioni come richiesto.

shutdownCookie dovrebbe essere il segreto con cui hai configurato il gestore di shutdown

Se la catena di gestione è configurata correttamente, funzionerà …

  public void start() throws Exception { Server server = new Server(10100); DebugHandler dh = new DebugHandler(); dh.setHandler(new ShutdownHandler(server,"foo")); server.setHandler(dh); server.start(); } public static void attemptShutdown(int port, String shutdownCookie) { try { URL url = new URL("http://localhost:" + port + "/shutdown?token=" + shutdownCookie); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setRequestMethod("POST"); connection.getResponseCode(); } catch (Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) { try { Shutdown s = new Shutdown(); s.start(); Shutdown.attemptShutdown(10100,"foobar"); } catch (Exception e) { e.printStackTrace(); } } 

Questo produce il seguente registro:

  Aug 22, 2013 9:31:25 AM org.eclipse.jetty.server.Server doStart INFO: jetty-8.1.11.v20130520 Aug 22, 2013 9:31:25 AM org.eclipse.jetty.server.AbstractConnector doStart INFO: Started [email protected]:10100 Aug 22, 2013 9:31:25 AM org.eclipse.jetty.server.handler.ShutdownHandler handle WARNING: Unauthorized shutdown attempt from 127.0.0.1 

La modifica dello shutdownCookie da ‘foobar’ a ‘pippo’ produce:

 2013-08-22 10:13:00.829:INFO:oejsh.ShutdownHandler:Shutting down by request from 127.0.0.1 

Puoi prendere il codice sopra e chiamare il metodo statico da un’altra JVM e il primo server si fermerà come previsto.

Sfortunatamente, il metodo ShutdownHandler non ha funzionato per me, ma ho esaminato il codice sorgente e ho trovato questo snippet che lo ha fatto.

 Socket s = new Socket(InetAddress.getByName("localhost"), STOP_PORT); try { OutputStream out = s.getOutputStream(); out.write((STOP_KEY + "\r\nstop\r\n").getBytes()); out.flush(); } finally { s.close(); }