Les pièges sur lesquels j'ai marché au début (Spring Boot 1.x)
1. Ajouter les dépendances de Mavne
<! - Springboot Monitoring -> <Dedency> <GroupId> org.springFramework.boot </prôdId> <ArtefactId> Spring-Boot-Starter-Actuator </ ArfactId> </Dependency>
2. Activer l'arrêt
Ajouter le fichier de configuration suivant
#Enable HTTP Accès de l'arrêt de fin de terminaison de terminaison de terminaison de terminaison de terminaison de terminaison de terminaison findpoint findpoint.shutdown.enabled = true # pas besoin de vérifier les points de terminaison.
Vous pouvez voir le journal suivant au démarrage, ce qui signifie qu'il réussit
3. Arrêt élégant
Envoyer la demande de poste http: // localhost: 8080 / arrêt
Si le code de réponse est 404, vous pouvez essayer de publier http: // localhost: 8080 / actionneur / arrêt
Spring Boot 2.0
Si la version Spring Boot que vous utilisez est 2.x, vous constaterez que ces demandes de publication auront le résultat de 404.
Voici comment Spring Boot 2.0 Elegant Adming temps est implémenté.
1. Modifier la classe de démarrage de l'application
Conteneur de tomcat
@SpringBootApplicationPublic classe ShutdownApplication {public static void main (String [] args) {springApplication.run (shutdownapplication.class, args); } / ** * Accepter les événements de fermeture * / @Bean public gracefulShutdown gracefulShutdown () {return new gracefulShutdown (); } / ** * Configurer tomcat * * @return * / @bean public servlettwebserverfactory servletContainer () {tomcatservletwebserverfactory tomcat = new tomcatservletwerverfactory (); tomcat.addconnectorCustomzers (GracefulShutdown ()); Retour Tomcat; } / ** * Fermez gracieusement le démarrage du ressort. Le conteneur doit être tomcat * / classe privée GracefulShutdown implémente TomCatConnectorCusizer, applicationListener <ftexedCloseEvent> {private final logger log = loggerfactory.getLogger (GracefulShutdown.class); connecteur de connecteur volatile privé; Temps de serte privé Final int = 10; @Override public void personnaliser (connecteur du connecteur) {this.connector = connecteur; } @Override public void onApplicationEvent (contextCloseEvent contextClosedEvent) {this.connector.pause (); Executeur Executor = this.connector.getProtoColHandler (). GetExecutor (); if (exécuteur de l'exécuteur de ThreadPoolExecutor) {try {ThreadPoolExecutor threadPoolExecutor = (threadPoolExecutor) exécutor; ThreadPoolExecutor.shutdown (); if (! ThreadPoolExecutor.AwiTterMination (Time Wait, timeUnit.seconds)) {Log.Warn ("Tomcat Process ne peut pas se terminer par" + Time Wait + "secondes, essayez de forcer la fin"); }} catch (InterruptedException ex) {thread.currentThread (). Interrupt (); }}}}}}}}}}}}}Conteneur Undertow (non utilisé, non garanti d'être disponible)
@SpringBootApplicationPublic class Application {public static void main (String [] args) {springApplication.run (application.class, args); } / ** * Fermer le démarrage de printemps élégamment * / @Component public class gracefulShutdown implémente applicationListener <ftexedCloseEvent> {@Autowired privé gracefulshutdownwrapper gracefulShutdownwrapper; @Autowired private servletwebserverApplicationContext context; @Override public void onApplicationEvent (contextCloseEvent contextClosedEvent) {gracefulshutdownwrapper.getGracefulShutdownHandler (). Shutdown (); essayez {UndertowservletWebserver webServer = (Undertowservletwerver) context.getWebserver (); Field Field = WebServer.getClass (). GetDeclaredField ("Undertow"); field.setAccessible (true); ENCERTOW ENCERTOW = (Undertow) Field.get (serveur Web); List <Undertow.ListenerInfo> écouterinerinfo = boundoge.getListenerInfo (); ENTROW.ListenerInfo auditeur = audinerInfo.get (0); ConnectorSticstics ConnectorStatistics = auditer.getConnectorStatistics (); while (ConnectorStatistics.getActiveConnections ()> 0) {}} catch (exception e) {// Application Shutdown}}} @component public class gracefulShutdownwrapper implémente le gestionnaire de gestionnaire {private gracefulShutdandler GracefulShutdownHandler; @Override public httphandler wrap (httphandler handler) {if (gracefulshutdownhandler == null) {this.gracefulshutdownhandler = new GracefulShutdownHandler (manageur); } Retour GracefulShutdownHandler; } public GracefulShutdownHandler getGraceSfulShutdownHandler () {return gracefulShutdownHandler; }} @Component @AlLargStructor Class public UnderTowExtraconfiguration {private final gracefulshutdownwrapper gracefulshutdownwrapper; @Bean Public Undertowservletwebserverfactory servletwebserverfactory () {Undertowservletwebserverfactory factory = new Undertowservletwebserverfactory (); factory.adddeploymentInfoCustomzers (DeploymentInfo -> DeploymentInfo.AddouterHandlerChainWrapper (GracefulShutdownwrapper))); factory.adddbuilderCustomzers (Builder -> builder.setServerORORTION (UnderTowoPtions.enable_statistics, true)); Retour Factory; }}}2. Utilisez la commande Kill pour tuer le processus
Utilisez la commande suivante pour tuer le processus. Cette commande envoie un signal de terminaison à un processus.
Kill -15 [PID]
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.