2010-03-08 8 views
6

La mia applicazione utilizza Spring DefaultMessageListenerContainer per elaborare i messaggi in arrivo. Il metodo principale dell'applicazione registra già un hook di chiusura.Il modo migliore per forzare lo spegnimento Spring da un bean?

La domanda è questa: qual è il modo migliore per forzare l'arresto del contesto dell'applicazione?

Se lancio un RuntimeException nel listener dei messaggi, viene gestito dal contenitore e non viene inoltrato. Sta chiamando System.exit accettabile? Devo passare il ApplicationContext ad ogni classe che deve essere chiusa, quindi posso chiamare close() su di esso?

+1

perché avete bisogno di chiudere giù il contesto dell'applicazione? – Bozho

+0

Poiché il listener dei messaggi può decidere che è necessario; o perché ha ricevuto un messaggio di amministrazione che chiede all'app di spegnersi o perché si è verificata una condizione anormale. Ce ne sono molti, uno di questi è troppi tentativi di essere ricevuti (questo è un sistema ad alto volume) – xcut

risposta

13

È possibile trasmettere il contesto dell'applicazione a ConfigurableApplicationContext e chiamare close() su di esso. Almeno questo è ciò che accade quando il contesto viene chiuso in un ambiente di applicazione Web, nei casi in cui il contesto di servlet viene distrutto.

Se si desidera ottenere ahold del ApplicationContext, il bean può implementare ApplicationContextAware

Un'altra opzione è quella di iniettare (o autowire con @Autowired) il contesto dell'applicazione:

@Inject 
private ApplicationContext ctx; 
+0

Come fa il bean che ha bisogno di fare l'arresto ottenere il contesto? Dopotutto è un POJO .. – xcut

+0

@xcut dipende dalla tua applicazione. È un'applicazione web, un'applicazione desktop? – Bozho

+0

Nessuno dei due: un sistema di accodamento/instradamento dei messaggi. Quindi immagino che l'unico modo sarebbe quello di passare il contesto al bean o implementare un ulteriore interfaccia per il ciclo di vita di qualche tipo? – xcut

Problemi correlati