我在 docker 容器中运行 spring 应用程序时遇到问题(spring 和 docker 在我的环境中都有最新版本)。 我希望应用程序类 AnalysisServiceBootstrap 拥有健康的生命周期:在创建 AnalysisServiceBootstrap 之后立即使用方法 start() 运行初始化代码,并在 AnalysisServiceBootstrap 销毁之前立即运行方法 stop() (我想在有人运行 stop() 代码时停止应用程序)。

我有以下代码:

package com.pack; 
import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 
 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.context.web.SpringBootServletInitializer; 
 
@SpringBootApplication 
public class AnalysisServiceBootstrap { 
 
    // called OK on docker "start <containerId>" 
    @PostConstruct 
    public void start() throws Exception { 
        // some init code 
    } 
 
    // NOT called on "docker stop <containerId>" 
    @PreDestroy 
    public void stop() { 
       // some destroy code 
    } 
 
    public static void main(String[] args) { 
        SpringApplication.run(AnalysisServiceBootstrap.class, args); 
    } 
} 

出于某种原因,我无法在 docker stop 上运行 stop() 方法。 我尝试了 stackoverflow 和其他资源上提供的几种方法,但它们都不适合我。

我很高兴拥有适合您的代码(不仅仅是一些时髦的建议)。

这里几乎是我的 docker 文件:

FROM *********:6556/service-jvm 
 
ARG SERVICE_JAR_FILE 
 
ENV SERVICE_NAME service 
ENV HTTP_PORT 603 
ENV HTTPS_PORT 604 
ENV SERVICE_JAR /opt/my/project/${SERVICE_JAR_FILE} 
EXPOSE ${HTTP_PORT} ${HTTPS_PORT} 
COPY ${SERVICE_JAR_FILE} /opt/my/project/${SERVICE_JAR_FILE} 
 
CMD java -Xms1024m -Xmx1024m -dump:"/opt/my/project/dumppath" -javaagent:/opt/my/project/agent.jar -Djav.awt.headless=true -jar ${SERVICE_JAR}  

但是我们邀请您在这里发布您拥有的任何工作 docker 文件。

非常感谢。

请您参考如下方法:

来自文档:

docker stop

Stop one or more running containers The main process inside the container will receive SIGTERM, and after a grace period, SIGKILL

通过执行 docker stop,您只是终止了 java (Spring) 进程。

那么 Spring 上下文将正确关闭的保证是什么?

在 Spring 应用程序中处理 SIGTERM 的正确方法是添加关闭钩子(Hook)。

最终代码应该是这样的:

package com.pack; 
import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 
 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.context.web.SpringBootServletInitializer; 
 
@SpringBootApplication 
public class AnalysisServiceBootstrap { 
 
    @PostConstruct 
    public void start() throws Exception { 
        // some init code 
    } 
 
    @PreDestroy 
    public void tearDown() { 
       // some destroy code 
    } 
 
    public static void main(String[] args) { 
        Runtime.getRuntime().addShutdownHook(new Thread() { 
            @Override 
            public void run() { 
                // write here any instructions that should be executed 
                tearDown(); 
            }    
        }); 
 
 
        SpringApplication.run(AnalysisServiceBootstrap.class, args); 
    } 
} 

该过程在以下问题中进行了描述:


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!