ClientCommunicatorAdmin restart/Checker-run 等异常的处理

本文介绍了一种在JMX开发中屏蔽远程MBeanServer关闭导致的异常方法。通过设置连接检查周期为0,避免了心跳检测引起的警告信息。
在做JMX相关的开发过程中,下面这个异常一个会遇到:

2013-7-11 15:58:05 ClientCommunicatorAdmin restart
警告: Failed to restart: java.io.IOException: Failed to get a RMI stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 10.10.4.18; nested exception is:
java.net.ConnectException: Connection refused: connect]
2013-7-11 15:58:06 RMIConnector RMIClientCommunicatorAdmin-doStop
警告: Failed to call the method close():java.rmi.ConnectException: Connection refused to host: 10.10.4.18; nested exception is:
java.net.ConnectException: Connection refused: connect
2013-7-11 15:58:06 ClientCommunicatorAdmin Checker-run
警告: Failed to check connection: java.net.ConnectException: Connection refused: connect
2013-7-11 15:58:06 ClientCommunicatorAdmin Checker-run

但具体解决方式却不是显而易见的。Google了好长时间,大部分都提到了使用完Socket要及时关闭之类的,并不相关。
我大大致分析了java代码后,解决了该问题。

分析过程如下:
我们一般创建一个MBeanServerConnection的过程

JMXServiceURL serviceurl = new JMXServiceURL(url);
JMXConnector conn = JMXConnectorFactory.connect(serviceurl, null);
MBeanServerConnection mbsc = conn
.getMBeanServerConnection();

此时可以用mbsc来获取相应的属性值,执行相应的方法等。但如果此时远程MBeanServer关闭了,不久就会抛出上面的异常。该异常是不受代码控制的,也就是try,catch并不能捕获。
而如果要屏蔽掉异常信息,只能从java代码入手分析。
我们在创建一个JMXConnector时使用如下方式:
JMXConnector conn = JMXConnectorFactory.connect(serviceurl, null);

此时,第二个参数可以指定一些环境信息。
当JMXConnector为RMI的时候,RMI的connect方法中有如下代码:

final long checkPeriod = EnvHelp.getConnectionCheckPeriod(usemap);
communicatorAdmin = new RMIClientCommunicatorAdmin(checkPeriod);

public RMIClientCommunicatorAdmin(long period) {
super(period);
}
其super方法调用:
public ClientCommunicatorAdmin(long period) {
this.period = period;

if (period > 0) {
checker = new Checker();

Thread t = new Thread(checker);
t.setDaemon(true);
t.start();
} else
checker = null;
}

从上面的代码可以看出,RMIConnector的connect方法中会创建一个RMIClientCommunicatorAdmin,该类会根据传入的env创建一个Checker,用来检测MBeanServer和Client的心跳。
其默认值

public static long getConnectionCheckPeriod(Map env) {
return getIntegerAttribute(env, CLIENT_CONNECTION_CHECK_PERIOD, 60000L,
0, Long.MAX_VALUE);
}

大于0,所以Checker会成功创建。

通过以上分析,如果我们不需要Checker,只需要在创建Connector的时候提供env,设置相应的属性值不大于0就可以了。
所以改成如下创建方式:

JMXServiceURL serviceurl = new JMXServiceURL(url);
Map m = new HashMap();
m.put("jmx.remote.x.client.connection.check.period", 0L);
conn = JMXConnectorFactory.connect(serviceurl, m);
MBeanServerConnection mbsc = conn
.getMBeanServerConnection();

即可成功屏蔽开头提到的异常信息。
<think> 我们被要求使用中文回答问题,并且在回答后必须提出3-5个相关问题,问题以“§§相关问题§§”开头,且不能换行分散。 用户提供了一个docker运行命令,我们需要解释这个命令,并据此提出相关问题。 解释命令: docker run: 运行一个容器 -d: 后台运行 --restart=always: 总是重启(当容器退出时,docker会重新启动它) --name seata: 容器名为seata -p 8091:8091: 将容器的8091端口映射到主机的8091端口 -p 7091:7091: 将容器的7091端口映射到主机的7091端口 -v /data/seata-server:/seata-server: 将主机的/data/seata-server目录挂载到容器的/seata-server目录 seataio/seata-server:2.0.0: 使用的镜像 根据这个命令,我们可以提出一些相关问题,比如关于配置、使用、优化等。 注意:问题数量在3-5个,且要基于用户的问题和我们的回答。 </think> 这条命令用于在后台运行 Seata 服务端容器。以下是详细解析: ### 命令结构说明 ```bash docker run -d \ # 后台运行容器 --restart=always \ # 自动重启策略 --name seata \ # 容器名称 -p 8091:8091 \ # 暴露TC服务端口(事务协调) -p 7091:7091 \ # 暴露控制台端口 -v /data/seata-server:/seata-server \ # 挂载配置文件目录 seataio/seata-server:2.0.0 # 官方镜像版本 ``` ### 关键配置说明 ```mermaid graph LR A[主机目录] -->|挂载| B[/data/seata-server] B --> C[容器目录] C --> D[/seata-server] D --> E[配置文件] E --> F[registry.conf] F --> G[注册中心配置] E --> H[file.conf] H --> I[事务存储配置] ``` ### 端口用途 | 端口 | 协议 | 功能 | |------|------|------| | 8091 | TCP | 事务协调器(TC)服务端口,微服务接入使用 | | 7091 | HTTP | Seata控制台管理端口 | ### 配置建议 1. **挂载目录准备**: ```bash mkdir -p /data/seata-server/resources # 需自行添加配置文件: # registry.conf - 注册中心配置(Nacos/Zookeeper等) # file.conf - 事务日志存储配置(DB/Redis) ``` 2. **常用管理命令**: ```bash # 查看日志 docker logs -f seata # 进入容器 docker exec -it seata sh # 重启服务 docker restart seata ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值