当使用ehcache部署Spring启动应用程序时,Tomcat不会关闭

时间:2016-10-18 09:47:25

标签: java tomcat java-ee spring-boot tomcat8

我对tomcat有一个奇怪的问题,我在tomcat上部署了一个spring boot应用程序(Stand alone not embedded)。我能够成功启动tomcat,它可以解决任何问题。但是当我运行shutdown(调用shutdown.sh脚本)时,它显示连接被拒绝。我试过了这个

Tomcat doesn't stop. How can I debug this?,但无法解决我的问题。我已经尝试删除我的春季启动应用程序,它可以解决任何问题。我能够启动和停止tomcat。经过进一步分析后,我发现这是因为在spring boot应用程序中配置了ehache。需要配置ehcache的关闭监听器,在春季启动时最好的方法是什么。

我也试过这个选项。

How to shutdown a Spring Boot Application in a correct way?

./shutdown.sh
Using CATALINA_BASE:   /app/tomcat/myapp
Using CATALINA_HOME:   /app/tomcat/myapp
Using CATALINA_TMPDIR: /app/tomcat/myapp/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_71
Using CLASSPATH:   

    /app/tomcat/myapp/bin/bootstrap.jar:/app/tomcat/myapp/bin/tomcat-juli.jar
    Oct 18, 2016 5:36:33 AM org.apache.catalina.startup.Catalina stopServer
  SEVERE: Could not contact localhost:8005. Tomcat may not be running.
Oct 18, 2016 5:43:31 AM org.apache.catalina.startup.Catalina stopServer
SEVERE: Catalina.stop:
java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at java.net.Socket.connect(Socket.java:538)
        at java.net.Socket.<init>(Socket.java:434)
        at java.net.Socket.<init>(Socket.java:211)
        at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:476)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:408)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:497)

#-> netstat -anpl|grep -i 8005
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      21668/java

我不确定为什么会这样?知道为什么会这样吗?为什么它无法收听关机端口?还为什么关闭端口有127.0.0.1?而其他过程没有它?

我尝试telnet到端口,它正在连接

telnet 127.0.0.1 8005
 Trying 127.0.0.1...
 Connected to 127.0.0.1.
 Escape character is '^]'.

知道为什么会出现问题。

--------更新

当我们将ehcache作为独立部署Spring boot应用程序时,我发现这种情况正在发生。必须调用ehcache关闭钩子....弹簧启动时最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

默认情况下,Spring Boot应用程序配置为独立运行。

如果要在Application Server(如Tomcat)中运行,首先需要删除嵌入式容器依赖项以防止任何冲突或争用。你可以找到一个关于如何做到这一点here的好指南。

如果您已经这样做并且仍然存在问题,则意味着您在Application Server内部运行了非守护程序线程(这会阻止它终止)。您可以使用jstack来识别这些内容,然后编写自己的ServletContextFinalizer以优雅地停止contextDestroyed上的这些主题。