Java 如果端口已被占用,则终止tomcat

Java 如果端口已被占用,则终止tomcat,java,tomcat,Java,Tomcat,我有一个web应用程序,它在tomcat上运行,并向另一个监控应用程序报告其状态(该监控应用程序监控系统中的其他几个进程) 如果该应用程序在tomcat中成功部署,则监控应用程序将显示该应用程序处于活动状态且可运行状态 但是,如果tomcat在serer.xml中的Connector元素中配置的端口上侦听失败,应用程序仍然会被部署,因此在监控应用程序中显示为live。但是,用户无法实际访问web应用程序,因为web服务器未在配置的端口上侦听 是否有一种方法可以配置tomcat,使其在服务器端口侦

我有一个web应用程序,它在tomcat上运行,并向另一个监控应用程序报告其状态(该监控应用程序监控系统中的其他几个进程)

如果该应用程序在tomcat中成功部署,则监控应用程序将显示该应用程序处于活动状态且可运行状态

但是,如果tomcat在
serer.xml
中的
Connector
元素中配置的端口上侦听失败,应用程序仍然会被部署,因此在监控应用程序中显示为live。但是,用户无法实际访问web应用程序,因为web服务器未在配置的端口上侦听


是否有一种方法可以配置tomcat,使其在服务器端口侦听失败时终止(或至少不部署webapps)?

您可以在
{tomcat\u setup}/bin/startup.sh
文件中编写一些脚本

在包含
可执行文件=catalina.sh
的行后添加以下脚本

parent=`dirname "$PRGDIR"`
file="$parent"/conf/server.xml
host=`hostname`
#get ports from server.xml
for i in `grep -o "<Connector port=\".*\"" "$file" | cut -d\" -f2`;
do
  #check port is listening
  ret=`cat < /dev/null > /dev/tcp/"$host"/"$i"`
  if [ $? -eq 0 ]; then
        echo "Tomcat is already working!"
        exit 1
  fi
done
parent=`dirname“$PRGDIR”`
file=“$parent”/conf/server.xml
主机=`hostname`
#从server.xml获取端口
对于'grep-o'/dev/tcp/“$host”/“$i”中的i`
如果[$?-eq 0];则
echo“Tomcat已经开始工作了!"
出口1
fi
完成
我发现这可能有助于实现绑定到Tomcat的
init
事件的逻辑,并检查其组件的状态(根据要点中的注释,您可能已经找到了一个maven工件,可以执行相同的操作)

创建一个生命周期侦听器,类似于
ConnectorListener
并使其实现
LifeCycleListener
接口。然后将gist中的代码放入重写的
lifeCycleEvent
方法中(您应该进行一些调整以使其适合)


然后将其添加到
标记下的
web.xml

为什么不让监控程序在应用程序部署后尝试在相关端口上发送请求?在部署的应用程序上放置类似mock
alive.html
的东西?为什么不使用HTTP探测来检测“活动性”“使用应用程序而不是将应用程序电话放在监控系统的家中?@ShmulikKlein您的方法很好,但监控应用程序不在我的控制之下。它是由一个独立的团队开发的,它有自己的API与之通信。这是它第一次监视web应用程序。我不明白要点中给出的代码应该放在哪里。你能解释一下吗?我已经把答案做得更详细了一点。我没有找到在应用程序中添加lifeccycle侦听器的方法。根据文档,()生命周期侦听器应添加到context.xml中,并放置在
$CATALINA_HOME/lib
目录中。我也找不到对
标记的任何引用。