2013-08-26 13 views
7

Abbiamo bisogno di implementare un meccanismo di spegnimento regolare nella nostra applicazione Servlet.Come elaborare le richieste servlet durante un arresto prolungato

MODIFICA: Vogliamo rendere il più semplice possibile, che gestirà un segnale kill inviato tramite la funzione del sistema operativo. Ciò consentirebbe agli amministratori di sistema di utilizzare utilità di shell incorporate (kill o taskkill su Windows), altrimenti dovrebbero installare un'altra utility solo per "parlare" con il server.

Questo meccanismo funziona in due fasi:

  1. su richiesta di arresto, negare alcune attività critiche
  2. blocco fino azioni critiche precedentemente avviate sono completati; questi possono richiedere diverse ore

La fase n. 1 è implementata nel nostro livello DAO. La fase n. 2 è implementata nel nostro servletContextListener # contextDestroyed method

Il nostro problema è che, una volta contextDestroyed viene chiamato, il contenitore Servlet smette di servire ulteriori richieste HTTP.

MODIFICA: contextDestroyed viene chiamato quando qualcuno chiama la funzione di eliminazione del sistema operativo sul processo del server.

Vorremmo lasciare l'applicazione attiva durante la fase n. 2, notificando agli utenti che alcune attività non sono disponibili.

+0

Buona domanda. Se le attività che devono essere negate vengono implementate in servlet specifici, è possibile sempre rendere questi (e solo questi) restituire uno stato nell'intervallo 4xx se una ricerca DB suggerisce che è in corso una chiusura? –

+0

Alcune delle attività sono avviate da azioni dell'interfaccia utente e alcune sono avviate da uno scheduler. Ecco perché sto pensando di controllarle a livello di DAO. –

risposta

4

Utilizzare un filter per mantenere un elenco di tutte le richieste critiche.

Quando viene ricevuta la richiesta di "preparazione all'arresto", il filtro dovrebbe iniziare a rifiutare alcune richieste.

Scrive un servlet che indica quanti processi critici rimangono ancora nella coda.

Nello strumento di arresto, inviare "prepara lo spegnimento". Il sondaggio del servlet per il numero di lavori critici. Quando questo raggiunge 0, invia il comando di spegnimento vero e proprio.

Per fare in modo che ciò accada, creare un servizio nel livello aziendale che lo orchestra. Nota che tutto deve succedere a prima delcontextDestroyed() viene chiamato! L'arresto speciale dell'applicazione non si adatta alla vista J2EE del mondo, quindi devi gestirlo tu stesso.

Il servizio dovrebbe essere in grado di comunicare alle parti interessate quando è in corso uno spegnimento, quanti lavori critici sono ancora in esecuzione, ecc. Servlet e filtri possono quindi utilizzare questo servizio per negare le richieste o indicare quanti lavori rimangono.

Al termine di tutti i lavori, rifiutare tutte le richieste tranne l'accesso al servlet "shutdown info" che dovrebbe quindi indicare che l'app è pronta per la morte.

Scrive uno strumento che offre agli amministratori una bella interfaccia utente per avviare l'arresto della tua app.

[EDIT] Si può essere tentati di impedire al sistema operativo di chiudere l'applicazione. Non farlo.

Che cosa si dovrebbe fare è scrivere uno strumento speciale per arrestare l'applicazione utilizzando il processo in due fasi che ho descritto sopra. Questo dovrebbe essere il modo standard di spegnimento.

Sì, gli amministratori si lamenteranno. Su Unix, puoi nascondere questo strumento inserendolo nello script di init, quindi nessuno lo noterà. Potrebbe esserci una soluzione simile su Windows.

Uccidere il server dovrebbe essere sempre possibile essere in grado di fermarlo in caso di (non) circostanze attese come: bug nel codice di spegnimento, arresto di emergenza durante l'interruzione di corrente, errori nel codice dell'applicazione o quando Murphy accade.

+0

Alcune delle attività sono avviate da azioni dell'interfaccia utente e alcune sono avviate da uno scheduler. Un filtro non funzionerà con le azioni avviate dallo scheduler. –

+0

Il filtro dovrà mantenere l'elenco/la coda in una posizione globale (variabile statica o una voce nell'ambito dell'applicazione). Ciò rende possibile implementarlo in modo che lo schedulatore possa vederlo. Se tutto il resto fallisce, utilizzare un framework DI. –

+0

Ciò renderebbe "conoscibile" il livello della logica di business sul livello di presentazione, no? –

Problemi correlati