2013-05-04 2 views
8

ich eine Spring-Bean in beans.xml definiert haben, wie folgt:@PreDestroy Methode eines Frühlings Singleton Bohne nicht genannt

<context:annotation-config /> 
[...] 
<bean id="myBackend" class="mycompany.BackendBean" scope="singleton" /> 

Im Inneren der Bohne sind zwei Methoden, die zu Beginn und vor Beendigung der ausgeführt werden muss Webapplikation:

public class BackendBean implements IBackend { 
    private static final Logger LOGGER = LoggerFactory 
      .getLogger(BackendBean.class); 

    @PostConstruct 
    public void init() 
    { 
     LOGGER.debug("init"); 
    } 

    @PreDestroy 
    public void destroy() 
    { 
     LOGGER.debug("destroy"); 
    } 
} 

Wenn ich den Server (mvn jetty:run) laufen, I die Ausgabe des init Methode in der Konsole sehen kann, von dem ich feststellen, dass die init Verfahren ausgeführt wird.

Wenn ich Ctrl-C drücke und Jetty herunterzufahren beginnt, sehe ich die Ausgabe der destroy Methode nicht.

Was muss ich ändern, damit die Methode destroy ausgeführt wird, wenn die Anwendung beendet wird?

+0

Planen Sie, die Anwendung auf Anlegesteg auszuführen? Oder müssen Sie es in mehr Behältern laufen lassen? – ssedano

+0

Ich benutze Jetty nur für schnelle Tests. In der Produktion verwende ich Apache Tomcat 7. –

Antwort

8

für Frühling @PreDestroy Callback-Methode aufrufen, wenn Sie Anwendung heruntergefahren, müssen Sie einen Shutdown-Hook hinzufügen und den Anwendungskontext es in schließen. Sie könnten den Haken JVM mit Runtime.getRuntime().addShutdownHook(Thread) oder Jetty befestigen, wenn es stellt eine solche API . Hier ist, wie Sie es mit JVM Shutdown Hook tun würden:

final ApplicationContext appContext = ... // create your application context 
         // using one of the various application context classes 
Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { 
     appContext.close(); 
    }}); 
+11

Es gibt 'appContext.registerShutdownHook()' für das. – Vitaly

+0

Danke. Wo (in welcher Methode) sollte ich die Shutdown-Hook-Registrierung setzen? –

+1

@DmitriPisarenko Der beste Ort wäre, wo Sie Ihre Feder Anwendung Kontext initialisieren. –

0

Ich weiß nicht, warum Sie wollen Spring, um dies zu kümmern. Wenn ich Ihre Frage nicht falsch verstanden habe, können Sie mit dem Lebenszyklus der Containeranwendung fortfahren.

Versuchen Sie, eine LifeCycle (jetty) und LifeCycleListener (tomcat) und Überschreibung in LifeCyleonStart und onStop zu schreiben. Und arbeite eine ähnliche Lösung für LifeCycleListener in Tomcat, wenn die entsprechende event stattfindet.

+4

Wenn Sie das tun, induzieren Sie eine Abhängigkeit zwischen dem Shutdown-Code und dem Container. Es ist wahrscheinlich besser, dies zu vermeiden und eine einzige Abhängigkeit zu Spring zu halten, die bereits vorhanden ist (oder besser noch jede Abhängigkeit zu Spring zu entfernen und javax.inject-Annotationen zu verwenden). –

Verwandte Themen