2016-12-08 3 views
0

Ich habe diese Konfiguration mit Spring Boot:Stopp Frühlings-Boot auf Fadenfehler

@Bean 
public TaskExecutor a() { 
    return new SimpleAsyncTaskExecutor(); 
} 

@Bean 
public CommandLineRunner b() { 
    return (String... args) -> { 
    RunnableTask task = SomeRunnableTask(); 
    a().execute(task); 
    }; 
} 

Wenn dieser Thread Anschläge (aus irgendeinem Grund) ich den Frühling Boot-Anwendung heruntergefahren werden soll.

Der Thread ist ein langwieriger Prozess, der mit einer Datenbank, einem Webservice, einem Socket ... verbunden ist. Es ist also ziemlich wahrscheinlich, dass es an einem bestimmten Punkt scheitern wird.

Was ist der richtige Weg, um Spring Boot herunterzufahren, wenn ein Thread stoppt? Sollte ich nicht SimpleAsyncTaskExecutor von Spring verwenden?

Danke!

+0

Also, was haben Sie versucht, die App zu verlassen? Hat 'System.exit (1)' nicht für Sie funktioniert? – Strelok

+0

'System.exit (1)' Ich habe es versucht, und es funktioniert, aber ich würde definitiv lieber die Anwendung auf eine anmutige Weise herunterfahren, rufen Sie die Spring Boot 'close()' Methode, um sicherzustellen, dass alles gereinigt wird oben. Ist das nicht sinnvoller als ein einfaches und "brutales" System.exit (1)? – Will

+0

@Strelok trotzdem bin ich kein Entwickler, also wenn Sie denken, dass ich das System einfach so verlassen sollte, bin ich glücklich. Ich hatte erwartet, dass Spring Boot einen Mechanismus hat, mir zu sagen, wenn ein Thread tot ist, damit ich entsprechend handeln kann. – Will

Antwort

1

Frühlings-Boot hat eine ShutdownEndpoint die

Die Anwendung ermöglicht es ordnungsgemäß herunterzufahren (standardmäßig nicht aktiviert) zu sein.

Sie haben einen Blick auf sie nehmen:

Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(500L); // For the response to be sent back to the requester 
     } 
     catch (InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
     } 
     ShutdownEndpoint.this.context.close(); // The ConfigurableApplicationContext 
    } 
}); 
thread.setContextClassLoader(getClass().getClassLoader()); 
thread.start();