Spring Boot Actuator - "/shutdown" не работает с ошибкой 500
Исходная информация
У меня есть веб-приложение Spring Boot, использующее Actuator для производственных утилит.
Приложение работает нормально, а порт управления работает отлично. Я могу просматривать статистику, проверять состояние и т. Д. Я также включил удаленную конечную точку выключения, и она правильно отображается в localhost:{mgmt_port}/ исполнительный список конечных точек.
Моя проблема
Когда я иду на localhost:{mgmt_port}/shutdown, я вижу:
<Map>
<timestamp>1453905900007</timestamp>
<status>500</status>
<error>Internal Server Error</error>
<exception>org.springframework.web.HttpRequestMethodNotSupportedException</exception>
<message>Request method 'GET' not supported</message>
<path>/shutdown</path>
</Map>
Полезная информация
Кажется, что все приложение все еще работает после нажатия на отключенную ссылку. Я все еще могу получать данные из конечных точек моего пользовательского приложения.
URL управления, предоставляемый приводом Spring, также, кажется, все еще работает нормально после выключения.
Консольный вывод перед выпуском
10:01:42.496 [main] INFO osbcetTomcatEmbeddedServletContainer - Tomcat запущен на портах: 8002 (http) 10:01:42.499 [main] INFO com.xyz.api.Main - запущен Main за 5,956 секунд (JVM работает для 6,381)
Консольный вывод после выпуска
10:03:29.090 [http-nio-8003-exec-1] INFO oaccC [Tomcat-1].[Localhost].[/] - Инициализация Spring FrameworkServlet 'dispatcherServlet' 10:03:29.090 [http-nio-8003-exec-1] INFO osweb.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': инициализация началась 10:03:29.126 [http-nio-8003-exec-1] ИНФОРМАЦИЯ osweb.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': инициализация завершена в 36 ms 10:03:29.151 [http-nio-8003-exec-1] ОШИБКА oaccC [.[.[.[dispatcherServlet] - Servlet.service() для сервлета [dispatcherServlet] в контексте с исключением пути пути [] [метод запроса "GET" не поддерживается] с коренной причиной org.springframework.web.HttpRequestMethodNotSupportedException: метод запроса "GET" не поддерживается в org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMa. -webmvc-4.2.4.RELEASE.jar!/:4.2.4.RELEASE] at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:382) ~[spring-webmvc-4.2.4.RELEASE.jar!/:4.2.4.RELEASE] в org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerMhoj.j.) ~ [spring-webmvc-4.2.4.RELEASE.jar! /: 4.2.4.RELEASE] в org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:60) ~[spring-webvc] 4.2.4.RELEASE.jar!/:4.2.4.RELEASE] at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:351) ~[spring-webmvc-4.2.4.RELEASE.jar!/:4.2.4.RELEASE] at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcChildContextConfiguration$CompositeHandlerMapping.getHandler(EndpointWebMvcChildContextConfiguration.java:212 Act!! 1.3.2.RELEASE] at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1120) ~[spring-webmvc-4.2.4.RELEASE.jar!/:4.2.4.RELEASE] в org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:932) ~[spring-webmvc-4.2.4.RELEASE.jar!/:4.2.4.RELEASE] в org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) ~[spring-webmvc-4.2.4.RELEASE.jar!/:4.2.4.RELEASE] в org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java)) ~ [spring-webmvc-4.2.4.RELEASE.jar! /: 4.2.4.RELEASE] на org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860) ~[spring-webmvc-4.2.4.RELEASE.jar!/:4.2.4.RELEASE] в javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845) ~[spring-webmvc-4.2.4.RELEASE.jar!/:4.2.4.RELEASE] по адресу javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterC) hain.java:291) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) ~[tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) [tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) [tomcat-embed-core-8.0.30.jar!/:8.0.30] at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) [tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) [tomcat-embed-core-8.0.30.jar!/:8.0.30] в org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) [tomcat-embed-core-8.0.30.jar!/:8.0.30] в java.util.concurrent.ThreadPoolExecutor.runWorker(неизвестный источник) [na:1.8.0_51] в java.util.concurrent.ThreadPoolExecutor$Worker.run(неизвестный источник) [na: 1.8.0_51] в org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.0.30.jar!/:8.0.30] на java.lang.Thread.run(неизвестный источник) [na: 1.8.0_51]
1 ответ
Отвечая на мой вопрос, чтобы помочь другим в будущем. Я болван... /actuator
В URL перечислены все доступные команды, и все они работают на основе GET
запрос.
/shutdown
URL на самом деле требует HTTP POST
чтобы быть отправленным на него, чтобы активировать его, хотя. Я не видел это нигде в документах.
Пример команды CURL:
> curl -X POST http://hostname:8003/shutdown
Вывод команды выключения:
<SingletonMap><message>Shutting down, bye...</message></SingletonMap>