2016-07-15 14 views
0

Ich versuche, meine Anwendung am Leben zu halten, um hören Sie für einige Nachrichten von meinem queue. Sobald meine Anwendung jedoch eine SIGTERM erhält, möchte ich sicherstellen, dass meine Anwendung ordnungsgemäß heruntergefahren wird. Stellen Sie sicher, dass die Jobs intern vor dem Herunterfahren zuerst beendet wurden.Wie Spring Bohnen richtig zu schließen, nachdem ein SIGTERM erhalten?

Nachdem darüber zu lesen, kam ich mit auf den Punkt:

@Component 
public class ParserListenerStarter { 

    public static void main(final String[] args) throws InterruptedException { 
     ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(ParserReceiveJmsContext.class); 
     context.registerShutdownHook(); 
     System.out.println("Listening..."); 
     Runtime.getRuntime().addShutdownHook(// 
       new Thread() { 
        @Override 
        public void run() { 
         System.out.println("Closing parser listener gracefully!"); 
         context.close(); 
        } 
       }); 

     while (true) { 
      Thread.sleep(1000); 
     } 
    } 

} 

Dann sende ich eine kill Befehl an meine Anwendung; und dies ist meine Ausgabe:

Listening... 
// output from my other beans here 
Closing parser listener gracefully! 

Process finished with exit code 143 (interrupted by signal 15: SIGTERM) 

Die shutdown Methoden aus meinen Bohnen wurden nicht genannt:

@PreDestroy public void shutdown() {..} 

Ich bin kein Experte in Spring, so tue mir leid für jeden dummen Punkt, dass ich Ich vermisse hier.

Wie kann ich shutdown meine Bohnen und dann meine Anwendung schön schließen?

Antwort

1

Alles, was Sie brauchen:

context.registerShutdownHook(); 

So fügen Sie den Code oben und dann wird Ihr @PreDestroy Methode aufgerufen werden. Danach müssen Sie nichts anderes tun. Es heißt, Sie löschen müssen

Runtime.getRuntime().addShutdownHook(// 
      new Thread() { 
       @Override 
       public void run() { 
        System.out.println("Closing parser listener gracefully!"); 
        context.close(); 
       } 
      }); 

Wenn Sie diese hinzugefügt, können Sie den Karabinerhaken ersetzt, die die Bohnen nicht zu zerstören, weil intern sieht Methode wie

if (this.shutdownHook == null) { 
     // No shutdown hook registered yet. 
     this.shutdownHook = new Thread() { 
      @Override 
      public void run() { 
       doClose(); 
      } 
     }; 
     Runtime.getRuntime().addShutdownHook(this.shutdownHook); 
    } 
+0

Sie rechts Nikolay sind! Ich danke Ihnen sehr für Ihre Antwort! –

Verwandte Themen