当前位置: 首页 > 科技观察

如何检测Tomcat的状态是UP还是DOWN?

时间:2023-03-22 14:29:12 科技观察

作为一名工程师,有时候,总会遇到部署的web应用没有响应,或者状态不正确等各种问题。对于部署在Tomcat上的Javaweb应用,我们一般都是像程咬金一样使用“三招”来分析问题。请检查进程是否在jstack,放下线程栈分析。我们在检查进程是否存在的时候,并没有直接去检查对应的Web应用。一般我们检查Tomcat对应的Java进程是否存在。如果应用程序没有响应,请另外观察线程堆栈。那么这里就有问题了。当Tomcat进程存在时,我们如何查看Tomcat的状态呢?毕竟作为Java应用程序,一启动就会创建一个进程。这不能作为Tomcat工作的真正依据。有什么方法可以判断此时Tomcat当前的工作状态吗?一般在做集群中容器的心跳状态检测时,也会遇到同样的问题。在这种情况下,如果Tomcat部署了ROOT应用程序,您可以通过访问其指定页面来确认请求是否可达,以确认Tomcat的状态。另一种方法是通过连接到Tomcat的MBeanServer来确认其状态。通常,如果Tomcat宕机,MBeanServer也会连接失败。在上一篇文章中,我们介绍了JMX连接Tomcat提供的MBeanServer(你知道JMX在Tomcat中的应用吗?),可以对容器相关的组件进行一系列的操作,甚至是像这样看似“危险”的操作启动和停止连接器。当然,通过JMXURL连接TomcatMBeanServer需要在启动脚本中配置参数启用。另外,也可以使用类似JConsole的方法连接各个JVM进程,连接到VirtualMachine后获得。我们稍后会写一篇关于这个方法的文章。官方FQA中也提到了检测状态的一种实现方式。熟悉Tomcat配置的朋友都知道,在一台机器上部署多个Tomcat时,经常会出现端口冲突的情况,因为在server.xml中配置了多个端口供实例使用。除了Connector监听的端口外,还有一个Server组件使用的端口,默认为8005。多个实例之间,除了Connector端口,SHUTDOWN端口也有冲突。这里对Tomcat状态的检测,就是通过连接到这个“端口”来实现的。说到端口,大家的第一印象肯定是Socket,它连接的是这个端口对应的ServerSocket。如果能正常连接,说明Tomcat正在运行。Socket连接不上,Tomcat自然不可用。这个端口除了获取状态还能做什么?它还可以停止Tomcat进程。毕竟,这个端口被称为SHUTDOWN端口。实现起来也比较简单。在Tomcat的SHUTDOWN端口旁边,还有一个属性,用作标记来标识关闭Tomcat的命令。当服务器收到带有此令牌的命令时,它会退出实例。完整的实现需要根据指定的Tomcat安装目录解析配置文件,获取SHUTDOWN端口,以及对应的token,连接对应的ServerSocket,获取状态,执行命令。【本文为专栏作家“侯书城”原创稿件,转载请通过作者微信公众号“Tomcat物语”获得授权】点此查看本作者更多好文