解决tomcat启动jmx远程管理后,关闭tomcat报端口占用错误的问题

参考:
https://blog.csdn.net/liyiliyi/article/details/1188641
http://issues.apache.org/bugzilla/show_bug.cgi?id=36976

问题描述

为了方便使用JMX管理tomcat,监控服务性能等状况,对tomcat服务器bin/catalina.sh(window下是catalina.bat)做了如下改动:

#java虚拟机启动参数追加如下配置信息
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=ip地址 -Dcom.sun.management.jmxremote.port=端口1090 -Dcom.sun.management.jmxremote.rmi=端口1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

修改完成后,启动服务,查看配置的1090端口的占用。无任何异常,且本地也可以使用jmx连接远程服务进行指标监控。

#可以使用如下命令查看端口信息
netstat -aon|grep 1090

但是在关闭服务shutdown时,报如下错误:

...
Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 1090; nested exception is: 
	java.net.BindException: Address already in use (Bind failed)
jdk.internal.agent.AgentConfigurationError: java.rmi.server.ExportException: Port already in use: 1090; nested exception is: 
	java.net.BindException: Address already in use (Bind failed)
	at jdk.management.agent/sun.management.jmxremote.ConnectorBootstrap.startRemoteConnectorServer(ConnectorBootstrap.java:491)
	at jdk.management.agent/jdk.internal.agent.Agent.startAgent(Agent.java:447)
	at jdk.management.agent/jdk.internal.agent.Agent.startAgent(Agent.java:599)
Caused by: java.rmi.server.ExportException: Port already in use: 1090; nested exception is: 
	java.net.BindException: Address already in use (Bind failed)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:335)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:243)
	at java.rmi/sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:412)
	at java.rmi/sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147)
	at java.rmi/sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:234)
	at java.rmi/sun.rmi.registry.RegistryImpl.setup(RegistryImpl.java:220)
	at java.rmi/sun.rmi.registry.RegistryImpl.<init>(RegistryImpl.java:180)
	at jdk.management.agent/sun.management.jmxremote.SingleEntryRegistry.<init>(SingleEntryRegistry.java:49)
	at jdk.management.agent/sun.management.jmxremote.ConnectorBootstrap.exportMBeanServer(ConnectorBootstrap.java:836)
	at jdk.management.agent/sun.management.jmxremote.ConnectorBootstrap.startRemoteConnectorServer(ConnectorBootstrap.java:479)
	... 2 more
Caused by: java.net.BindException: Address already in use (Bind failed)
	at java.base/java.net.PlainSocketImpl.socketBind(Native Method)
	at java.base/java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:436)
	at java.base/java.net.ServerSocket.bind(ServerSocket.java:381)
	at java.base/java.net.ServerSocket.<init>(ServerSocket.java:243)
	at java.base/java.net.ServerSocket.<init>(ServerSocket.java:135)
	at java.rmi/sun.rmi.transport.tcp.TCPDirectSocketFactory.createServerSocket(TCPDirectSocketFactory.java:45)
	at java.rmi/sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(TCPEndpoint.java:670)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:324)
	... 11 more

问题分析

这是什么错误呢?
经过百度,发现问题是:
如上述配置时,tomcat在shutdown关闭时,会绑定jmx配置的端口1090,由于1090在tomcat启动时已经被绑定了,所以就产生报错了。

解决方案

根据问题分析,就明确了如何解决。即在tomcat启动时,jmx参数才有效;tomcat关闭时,不设置jmx参数。
但是,如何在catalina.sh执行时判断tomcat是启动还是关闭,这里我没有具体取百度。
而是,看了下catalina.sh脚本,在下边发现了启动时,会判断传入参数进行不同处理,所以就尝试了一下,在增加jvm的jmx参数前增加对启动参数的判断。
这样经过修改后,再次尝试启动/关闭tomcat,发现问题已经解决。

if [ "$1" = "start" ] ; then
  JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=ip地址 -Dcom.sun.management.jmxremote.port=端口1090 -Dcom.sun.management.jmxremote.rmi=端口1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
fi
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要配置Tomcat进行JMX远程监控,你可以按照以下步骤进行操作: 1. 打开Tomcat的bin目录,找到catalina.sh文件。 2. 在catalina.sh文件的开头添加以下配置参数: -Dcom.sun.management.jmxremote.port=8989 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=139.224.42.51 这些参数将设置JMX远程监控的端口、身份验证、SSL以及远程主机的IP地址。\[1\] 3. 保存并关闭catalina.sh文件。 4. 进入Tomcat的bin目录,使用脚本重启Tomcat。可以执行以下命令: ./shutdown.sh ./startup.sh 这将重启Tomcat服务器。\[2\] 5. 重启完成后,可以使用以下命令检查1099端口是否已经开放: netstat -ant 这将显示端口状态,你可以查看1099端口是否处于监听状态。\[2\] 通过以上步骤,你就可以成功配置Tomcat进行JMX远程监控了。请确保按照指定的配置参数进行设置,并且重启Tomcat后检查端口状态。\[1\]\[2\] #### 引用[.reference_title] - *1* [tomcat 配置jmx远程监控](https://blog.csdn.net/true_hsf/article/details/52315684)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Tomcat 开启远程监控(JMX)](https://blog.csdn.net/weixin_41924764/article/details/108694239)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [tomcat开启jmx远程监控](https://blog.csdn.net/Entity_G/article/details/111316532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值