停止 spring 应用程序上下文时 management.server.port 不关闭

Posted

技术标签:

【中文标题】停止 spring 应用程序上下文时 management.server.port 不关闭【英文标题】:management.server.port not shutdown when stopping spring application context 【发布时间】:2018-10-14 15:04:55 【问题描述】:

我在使用以下方法停止 Spring 应用程序上下文时遇到问题: ConfigurableApplicationContext.close();

http 端口已停止,但弹簧执行器管理端口management.server.port 9001 未关闭。

所以当我尝试重新启动应用程序时,spring 给出以下异常: org.springframework.boot.web.server.PortInUseException: Port 9001 is already in use

谢谢。


使用 application.properties 的 sn-p 更新:

management.server.port=9001
management.server.ssl.enabled=false
management.endpoints.web.exposure.include=info,health

【问题讨论】:

【参考方案1】:

我不确定我是否会提供任何帮助,但首先我会尝试手动杀死 9001 上运行的任何东西。

我使用命令:lsof -i :9001 获取 PID,然后使用kill -9 <PID>

然后尝试再次运行应用程序,它应该可以正常运行。等待关机并重新开始。

我在本地设置了一个非常基本的 Spring 应用程序,但无法复制该问题。

package com.example.demo;

import org.springframework.beans.BeansException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class DemoApplication implements ApplicationContextAware 

  private static ApplicationContext appContext;

  public static void main(String[] args) 
    SpringApplication.run(DemoApplication.class, args);

    ((ConfigurableApplicationContext)appContext).close();
  

  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException 
    appContext = applicationContext;
  

我的 yaml 文件如下所示:

management:
  server:
    port: 9001

server:
  port: 8080

您能否提供一个配置文件示例以及您在哪里调用ConfigurableApplicationContext.close();

【讨论】:

我用一段 application.properties 更新了这个问题。但我发现即使我删除它们问题仍然发生在下一个端口,例如http 端口。关闭真的关闭了所有端口吗? @user3675334 我在我的应用程序中放置了一个 Thread.sleep() 5 秒,以查看应用程序是否真的在 8080 上运行,然后在 5 秒后再次检查。一切都关闭了。我在想的是你的 Spring 上下文正在关闭,但你的服务器连接没有。我在 IntelliJ 中运行我的应用程序,您可以设置一个 tomcat 服务器配置。 Run/Debug Configuration -> + -> Tomcat Server -> On update action: Restart Server。这里的一些答案也可能会有所帮助***.com/questions/29169916/… 谢谢。最近太忙了。目前不在这,但我会在回到这个时尝试找出更多。

以上是关于停止 spring 应用程序上下文时 management.server.port 不关闭的主要内容,如果未能解决你的问题,请参考以下文章

在关机时停止所有 Spring 批处理作业 (CTRL-C)

Spring 事件监听

当我的tomcat关闭时,没有调用spring bean的destroy-method

Spring的Lifecycle

即使加载失败,也要在 Spring 测试中缓存上下文

Spring Cloud Consul—HTTP健康检查