我无法在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);
}
}由于某些原因,我不能让方法stop()在docker 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文件。
非常感谢。
发布于 2017-03-14 14:54:22
从文档中:
docker stop
停止一个或多个正在运行的容器容器内的主进程将接收SIGTERM,并在一段宽限期后接收SIGKILL
通过执行docker stop,您将终止java (Spring)进程。
那么,如何保证Spring context将正常关闭呢?
在Spring应用程序中处理SIGTERM的正确方法是添加关闭钩子。
最终的代码应该如下所示:
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);
}
}以下问题描述了该过程:
发布于 2017-03-14 14:59:19
向这里提到的应用程序注册一个关闭钩子Spring Boot shutdown hook
每个SpringApplication都会向JVM注册一个关闭钩子,以确保ApplicationContext在退出时正常关闭。所有标准的Spring生命周期回调(比如DisposableBean接口,或者@PreDestroy注解)都可以使用。
发布于 2020-06-17 14:46:10
@PreDestroy或实现DisposableBean的销毁()只有在我们执行ctrl+c或docker stop <>时才会执行。然而,如果我们停靠杀死<>或直接从intelij IDE停止它,它将不会执行
https://stackoverflow.com/questions/42779431
复制相似问题