`
chainhou
  • 浏览: 174908 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
在做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();

即可成功屏蔽开头提到的异常信息。
分享到:
评论

相关推荐

    Windows Servers2016 WSL环境安装

    dism /online /norestart /add-package /packagepath:Microsoft-Windows-Lxss-Optional-Package.cab /packagepath:Microsoft-Windows-Lxss-Optional-Package-en-US.cab /packagepath:Microsoft-Windows-Lxss-Package...

    DolphinScheduler+海豚

    具体错误信息未完全给出,但可以推断出是由于版本不匹配引发的异常。 #### 三、解决步骤详解 为了解决这一问题,我们需要按照以下步骤来操作: 1. **备份旧的Hive Jar包**: - 在三台服务器(39、40、41)上,先...

    jira私有化部署,docker安装

    docker run -v /home/project/jira/jiraData:/var/atlassian/application-data/jira --name="jira" -d --restart always --link mysql8.0:mysql -p 8080:8080 atlassian/jira-software docker exec --user root jira...

    ubuntu vps安装docker报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.问题解决

    在Ubuntu VPS上安装Docker时,可能会遇到一个常见的错误:“Cannot connect to the Docker daemon at unix:///var/run/docker.sock.” 这个问题通常是由于Docker守护进程未运行或者是由于Linux内核版本过低导致的。...

    vsftp-arm64

    docker run -d --name vsftpd --net=host -v /home/vsftpd:/etc/vsftpd -v /home/ftpusr:/home/ftpusr -v /home/ftpserver:/home/ftpserver --restart=always lstcml/vsftpd docker ps docker exec vsftpd ...

    Openssh 8.0升级方法和步骤

    /etc/init.d/sshd restart systemctl restart sshd ``` 最后,验证OpenSSH版本是否已成功升级到8.0,使用`ssh -V`命令查看: ```bash ssh -V ``` 整个升级流程至此结束。务必在升级前备份现有配置和相关文件,以...

    基于Nginx的负载均衡管理系统Lazybalancer.zip

    service supervisor restart 登录系统 http://[IP]:8000/ 首次登陆会要求创建管理员用户,如需修改,可在系统配置中重置管理员用户 演示 授权 本项目由 小宝 维护,采用 GPLv3 ...

    linux下启动mysql服务

    1. **错误处理** 当遇到类似 `ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)` 的错误时,可以通过以下两种方式解决: - 使用 `mysqladmin` 设置 root 用户密码并指定...

    Docker开启远程安全访问的图文教程详解

    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 ``` 这里的`-H tcp://0.0.0.0:2375`参数意味着Docker守护进程将监听所有网络接口(0.0.0.0)的2375端口...

    RestartAPP.zip

    // 在这里处理异常,例如记录日志、发送崩溃报告等 Log.e("APP", "Uncaught Exception", ex); // 如果希望应用在崩溃后重启,可以在这里进行操作 restartApp(); } }); ``` `restartApp()` 方法是关键,它...

    stylelint-module:Nuxt.js的Stylelint模块

    @ nuxtjs / stylelint-module Nuxt.js的Stylelint模块要求您需要确保已安装stylelint : yarn add --dev stylelint # or npm install --save-dev stylelint设置将@nuxtjs/stylelint-module依赖项添加到您的项目中...

    docker-zerotier-moon:一步即可创建ZeroTier卫星的泊坞窗图像

    docker run --name zerotier-moon -d --restart always -p 9993:9993/udp seedgou/zerotier-moon -4 1.2.3.4 用您的1.2.3.4 IP替换1.2.3.4 。 要显示您的月亮ID,请运行 docker logs zerotier-moon 注意:创建新...

    Linux命令学习总结:详解reboot命令

    相当于Windows系统中的restart命令。 命令语法: /sbin/reboot [-n] [-w] [-d] [-f] [-i] 或 reboot [-n] [-w] [-d] [-f] [-i] 命令参数: 参数 长参数 描叙 -d 重新启动时不把数据写入记录文件/...

    基于TF-IDF的通过运单号识别所属快递公司python源码+项目说明.zip

    2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...

    docker安装gitlab

    docker run --name='gitlab' -d \ --net=gitlab_net \ --publish 1443:443 --publish 18080:80 \ --restart always \ --volume /root/docker/gitlab/config:/etc/gitlab \ --volume /root/docker/...

    phpiredis封装类,支持根据前缀删除键值

    比单纯的redis好用多了。.../etc/init.d/nginx restart 2, 如果是CI用户,直接放到libraries下面,按照正常的libraries调用即可,主从库调用方式 $this->load->library ("ciredis", array("slave"));

    haproxy-1.8.23-1.el7.x86_64.rpm haproxy 1.8.23 rpm包

    可通过 systemctl 来进行 start 、stop 、restart 可通过 systemctl enable 、disable 来开启和禁止开机自动 演示: [root@web_test ~]# rpm -ivh haproxy-1.8.23-1.el7.x86_64.rpm Preparing... ###########...

    Openssh-8.3p1编译安装包.tar.zip

    windwos上解压上传服务器 tar xzvf openssh-8.3p1.tar.gz ./configure --prefix=/usr/ --sysconfdir=/etc/ssh/ --with-ssl-dir=/usr/local/ssl --with-md5-passwords --mandir=/usr/share/...systemctl restart sshd

    Go语言实现的简单的Maven仓库,用于在树莓派等小型服务器上部署.zip

    go:latestdocker run -d --name maven-go \ -v $PWD/config.yaml:/root/config.yaml \ -v $PWD/data:/data \ --restart always \ -p 8880:8880 \ f763180872/maven-goconfig.yaml为启动配置,默认配置见配置文件说明...

    docker快速安装gitlab-CentOS7

    1.下载镜像  docker pull twang2218/gitlab-ce-zh 2.创建/usr/local/docker/gitlab/... restart: always  hostname: ‘192.168.1.11’  environment:  TZ: ‘Asia/Shanghai’  GITLAB_OMNIBUS_CONFIG: |  extern

Global site tag (gtag.js) - Google Analytics