Terminating mvn spring-boot:run doesn't stop tomcat

后端 未结 18 1394
别那么骄傲
别那么骄傲 2020-12-04 07:11

I can successfully start spring-boot with mvn spring-boot, the documentation mentions to gracefully exit the application hit ctrl-c.



        
18条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-04 07:54

    You cause a shutdown by calling curl -v -X POST http://127.0.0.1:8091/shutdown provided you configured spring-boot properly.

    To support this you will have to update your application properties. This is partially described in https://stackoverflow.com/a/26563344/58794 .

    updating application.yml by adding:

    management:
      security:
        enabled: false
    endpoints:
      shutdown:
        enabled: true
    

    or updating application.properties by adding:

    management.security.enabled=false
    endpoints.shutdown.enabled=true
    

    Once called

    $ curl -v -X POST http://127.0.0.1:8091/shutdown
    * STATE: INIT => CONNECT handle 0x600057990; line 1423 (connection #-5000)
    * Added connection 0. The cache now contains 1 members
    *   Trying 127.0.0.1...
    * TCP_NODELAY set
    * STATE: CONNECT => WAITCONNECT handle 0x600057990; line 1475 (connection #0)
    * Connected to 127.0.0.1 (127.0.0.1) port 8091 (#0)
    * STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x600057990; line 1592 (connection #0)
    * Marked for [keep alive]: HTTP default
    * STATE: SENDPROTOCONNECT => DO handle 0x600057990; line 1610 (connection #0)
    > POST /shutdown HTTP/1.1
    > Host: 127.0.0.1:8091
    > User-Agent: curl/7.56.1
    > Accept: */*
    >
    * STATE: DO => DO_DONE handle 0x600057990; line 1689 (connection #0)
    * STATE: DO_DONE => WAITPERFORM handle 0x600057990; line 1814 (connection #0)
    * STATE: WAITPERFORM => PERFORM handle 0x600057990; line 1824 (connection #0)
    * HTTP 1.1 or later with persistent connection, pipelining supported
    < HTTP/1.1 200
    < X-Application-Context: application:h2:8091
    < Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
    < Transfer-Encoding: chunked
    < Date: Fri, 22 Dec 2017 07:01:04 GMT
    <
    * STATE: PERFORM => DONE handle 0x600057990; line 1993 (connection #0)
    * multi_done
    * Connection #0 to host 127.0.0.1 left intact
    * Expire cleared
    {"message":"Shutting down, bye..."}
    

    the container will shutdown

    o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 0
    o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
    j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
    

    but if you launched from mvn spring-boot:run you will likely get a:

    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 35.613 s
    [INFO] Finished at: 2017-12-22T02:01:05-05:00
    [INFO] Final Memory: 25M/577M
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.7.RELEASE:run (default-cli) on project PROJECTNAME: Could not exec java: Application finished with exit code: 1 -> [Help 1]
    

    If you do not have management.security.enabled=false you may be presented with the following error:

    $ curl -v -X POST http://127.0.0.1:8091/shutdown
    > POST /shutdown HTTP/1.1
    > Host: 127.0.0.1:8091
    > User-Agent: curl/7.56.1
    > Accept: */*
    >
    < HTTP/1.1 401
    < X-Application-Context: application:h2:8091
    < Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
    < Transfer-Encoding: chunked
    < Date: Fri, 22 Dec 2017 06:56:19 GMT
    <
    {"timestamp":1513925779265,"status":401,"error":"Unauthorized","message":"Full authentication is required to access this resource.","path":"/shutdown"}
    

    If you do not have endpoints.shutdown.enabled=true you will see:

    $ curl -v -X POST http://127.0.0.1:8091/shutdown
    > POST /shutdown HTTP/1.1
    > Host: 127.0.0.1:8091
    > User-Agent: curl/7.56.1
    > Accept: */*
    >
    < HTTP/1.1 404
    < X-Application-Context: application:h2:8091
    < Content-Type: application/json;charset=UTF-8
    < Transfer-Encoding: chunked
    < Date: Fri, 22 Dec 2017 06:58:52 GMT
    <
    {"timestamp":1513925932345,"status":404,"error":"Not Found","message":"No message available","path":"/shutdown"}
    

    If you try a GET instead of POST this error will be presented:

    $ curl -v http://127.0.0.1:8091/shutdown
    > GET /shutdown HTTP/1.1
    > Host: 127.0.0.1:8091
    > User-Agent: curl/7.56.1
    > Accept: */*
    >
    < HTTP/1.1 405
    < X-Application-Context: application:h2:8091
    < Allow: POST
    < Content-Type: application/json;charset=UTF-8
    < Transfer-Encoding: chunked
    < Date: Fri, 22 Dec 2017 06:54:12 GMT
    <
    {"timestamp":1513925652827,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'GET' not supported","path":"/shutdown"}
    

提交回复
热议问题