2015-03-20 17 views
5

Sto studiando per la certificazione Nucleo primavera e ho qualche dount circa su questa domanda scovato nel materiale di studio fornito:Come chiudere correttamente ApplicationContext in primavera?

Qual è il modo migliore per chiudere un contesto di applicazione?

so che se ho qualcosa di simile:

ConfigurableApplicationContext context = … 
// Destroy the application 
context.close(); 

con l'uso della vicino metodo() sul contesto objet l'ApplicationContext è chiuso e l'applicazione viene distrutto.

Ma penso che questo non sia il modo migliore per farlo.

Leggendo la documentazione ufficiale trovo che posso anche fare qualcosa di simile:

context.registerShutdownHook(); 

che registrare un gancio di arresto con la JVM quindi è la JVM che attiverà stretta fase di primavera prima uscite JVM . Quindi, all'uscita di JVM, verrà eseguita la fase di chiusura di Spring.

Sulla documentazione posso leggere che: di solito non è possibile chiamare context.close() perché molte applicazioni (applicazioni Web) funzionano indefinitamente Ma cosa significa esattamente quest'ultima asserzione? perché l'applicazione web funziona indefinitamente?

Quindi le mie domande sono:

  • Posso usare questo secondo modo per chiudere un contesto di applicazione anche con non applicazione web?
  • È preferibile rispettare lo context.close()?

Tnx

+1

'molte applicazioni (applicazioni Web) eseguite indefinitamente'. Di solito si riferisce a cose che accadono in un ciclo infinito a meno che non si interrompa il processo, qualcosa come il tuo SocketServer che ascolta le richieste in entrata. Perché vuoi chiudere manualmente WebApplicationContext in primo luogo? Di solito viene creato all'avvio del server e distrutto mentre il server è in arresto – Arkantos

+1

Un'applicazione Web non si interrompe mai perché, se lo fai, il sito non funziona. Se si desidera interrompere l'esecuzione dell'applicazione Web, verrà arrestato (ad esempio arrestando il server Web). Quando lo fai, anche la JVM viene arrestata, quindi "Arresto con la JVM" è il modo per chiudere il contesto con JVM. Perché vuoi interrompere il contesto? – rlm

+0

close viene utilizzato nelle applicazioni Web e shutDownHook viene utilizzato nelle applicazioni standalone. Ho appena postato la mia risposta con qualche altro dettaglio :) – Arkantos

risposta

10

Come sapete che ContextLoaderListener è quello che si occupa dell'inizializzazione e della distruzione di ApplicationContext, quando si arresta il server, viene richiamato il metodo contextDestroyed di ContextLoaderListener.

public void contextDestroyed(ServletContextEvent event){ 
    closeWebApplicationContext(event.getServletContext()); 
    ContextCleanupListener.cleanupAttributes(event.getServletContext()); 
    } 

In tal closeWebApplicationContext, in realtà chiamano il metodo close su ApplicationContext simili

if ((this.context instanceof ConfigurableWebApplicationContext)) { 
    ((ConfigurableWebApplicationContext)this.context).close(); 
    } 

Questo è direttamente dal spring-web-4.1.5.jar. Come è evidente da qui, usano close per distruggere ApplicationContext nelle applicazioni web.

Ma registerShutdownHook viene utilizzato per chiudere esplicitamente contenitore CIO in applicazioni non web qualcosa come un'applicazione desktop stand-alone, specialmente quando si sta creando l'ApplicationContext manualmente da ClassPathXmlApplicationContext (o) FileSystemXmlApplicationContext (o) alcuni altri tipi.

Questa operazione consente di rilasciare tutte le risorse utilizzate dall'applicazione Spring e di chiamare il metodo destroy sui bean spring, se presenti.

+0

in applicazione standalone, ad es. background Servizio o applicazione desktop, Quando si inserisce il metodo principale, si crea il contesto dell'applicazione, Ora la mia domanda è, Se si registra il JVM Hook e si esce dal metodo principale, Will This distruggerà il contesto? – Mubasher

7

sulla documentazione posso leggere che: di solito non è possibile chiamare context.close() perché molte applicazioni (applicazioni web) corrono all'infinito Ma che cosa significa esattamente questa ultima asserzione? perché l'applicazione web funziona indefinitamente?

Un'applicazione Web viene eseguita finché viene eseguito il server delle applicazioni che lo distribuisce. Spetta al server delle applicazioni (e non a te) avviare e arrestare correttamente l'applicazione. Ciò significa che quando il server delle applicazioni viene arrestato, il contesto del servlet viene distrutto. In un'applicazione Spring, la classe ContextLoaderListener registrata in web.xml ascolta questo evento (contesto distrutto) per chiudere correttamente il contesto Spring.

Quando si utilizza Spring all'esterno di un server di applicazioni (come un'applicazione autonoma), spetta a te interrompere correttamente il contesto Spring. Come hai detto, puoi farlo chiamando esplicitamente context.close() o registrando un hook di shutdown (context.registerShutdownHook()) che effettua questa chiamata per te.

+0

ok ma è context.registerShutdownHook() migliore di fare context.close()? – AndreaNobili

+0

Entrambi ['registerShutdownHook()'] (http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-context/3.2.3.RELEASE/org/springframework/context/support/ AbstractApplicationContext.java # AbstractApplicationContext.registerShutdownHook% 28% 29) e ['close()'] (http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-context/3.2.3 .RELEASE/org/springframework/context/ConfigurableApplicationContext.java # ConfigurableApplicationContext.close% 28% 29) i metodi chiamano lo stesso codice per chiudere il contesto Spring. Potete vederlo in 'AbstractApplicationContext'. – Tunaki

Problemi correlati