首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行SpringBootApplication PostConstruct和PreDestroy

运行SpringBootApplication PostConstruct和PreDestroy
EN

Stack Overflow用户
提问于 2017-03-14 14:50:28
回答 3查看 13.9K关注 0票数 3

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

我有以下代码:

代码语言:javascript
复制
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);
    }
}

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

我会很高兴有代码,为你工作(不仅仅是一些时尚的建议)。

下面是我的docker文件:

代码语言:javascript
复制
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文件。

非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2017-03-14 14:54:22

从文档中:

docker stop

停止一个或多个正在运行的容器容器内的主进程将接收SIGTERM,并在一段宽限期后接收SIGKILL

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

那么,如何保证Spring context将正常关闭呢?

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

最终的代码应该如下所示:

代码语言:javascript
复制
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);
    }
}

以下问题描述了该过程:

票数 10
EN

Stack Overflow用户

发布于 2017-03-14 14:59:19

向这里提到的应用程序注册一个关闭钩子Spring Boot shutdown hook

每个SpringApplication都会向JVM注册一个关闭钩子,以确保ApplicationContext在退出时正常关闭。所有标准的Spring生命周期回调(比如DisposableBean接口,或者@PreDestroy注解)都可以使用。

票数 1
EN

Stack Overflow用户

发布于 2020-06-17 14:46:10

@PreDestroy或实现DisposableBean的销毁()只有在我们执行ctrl+c或docker stop <>时才会执行。然而,如果我们停靠杀死<>或直接从intelij IDE停止它,它将不会执行

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42779431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档