zoukankan      html  css  js  c++  java
  • jmx : ClientCommunicatorAdmin Checker-run

    今天遇到一个问题:

    执行bat,关闭jmx的时候,由于程序关闭之后又去连接了一次,cmd窗口报错,类似:

    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

    这个是非常奇怪的现象,也不知道底层jdk是怎么实现的:

    一个线程A从某处p开启了另外的线程B,B抛出的异常,A在p处可以B的异常捕获吗???

    什么情况下可以,什么情况下不可以呢? 跟操作系统多核单核相关吗?

    搜索了很多个网站 ,最后在http://chainhou.iteye.com/blog/1906688 找到答案。(看来还是要花时间深入jdk源码进去才行啊, 不要有害怕心理,不要一不懂就问,有时候答案是自己稍微深究就出来的了!)

    尽管如此,也是非常不顺利的,因为项目代码中有多处使用了JMXConnectorFactory.connect(serviceurl, m); 这样的操作,而且分散开来了。 我开始只改了一个地方,导致问题一直没解决。一下子也非常难得确定到底哪次调用引起的, 因为有好几个后台进程, 而且远程调试非常不方便所以没用,每次都是打印日志来调试,很耗时间。。。

    主管检查后发现说, 这样:m.put("jmx.remote.x.client.connection.check.period", 0L);  不好,不能这么搞! 这个是心跳请求,每一分钟检查jmx是否还有连接,设置为0L之后呢就没有了检查, 可能导致前台状态显示不正确,风险,,,,。。 会吗, 我认为不是这样的,不是每次都会重新连接jmx查询的吗,, 可是。。。 我晕, ,

    另外一种方法是设置logging.properties文件(因为jmx用的是jdk的logging),把level改成severe,这样就可以屏蔽所有的warn,类似

    logger.warning("RMIClientCommunicatorAdmin-doStop",
                            "Failed to call the method close():" + ioe);

    , 不过他又说不能更改第三方的文件。。。 (大公司做事如此的麻烦谨慎。。。)

    重新修改原先代码逻辑?麻烦。。。

    重定向 system。out 。。?

    奇怪的是win7就不报错,但是2008就会有这个,怎么搞就搞不定, 也不知道底层什么原因。—— 莫非就是cpu单核多核引起的多线程问题?

    。。。

    后来有怀疑是jdk升级引起的, 从jdk1.7.0.1_17到了jdk1.7.0.1_45(最新版好像是47), oracle确实有对rmi/jmx相关参数做修改,把 -Djava.rmi.server.useCodebaseOnly从默认true设置了false

    http://www.oracle.com/technetwork/java/javase/downloads/index.html

    http://www.oracle.com/technetwork/java/javase/7u-relnotes-515228.htm转l

    http://www.oracle.com/technetwork/java/javase/7u21-relnotes-1932873.html

    http://www.oracle.com/technetwork/java/javase/7u21-relnotes-1932873.html#rmichanges

    http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

    以为这个会有影响。

    后来还是证明我的想法是错的,跟jre版本无关,而是 win7下的版本和2008上的版本并不相同引起的。

    新版本中执行shutdown的时候

    1 先关闭jvm1(异步)、

    2 然后关闭jvm2(异步),

    3 关闭jvm2的时候先尝试获取jvm上的jmx连接资源connector,

    4 jvm1真正关闭,connector抛出异常!

    就是这个原因!

  • 相关阅读:
    什么是wsgi,uwsgi,uWSGI
    Flask 和 Django 路由映射的区别
    简述浏览器通过WSGI请求动态资源的过程
    前端qq交流群
    python qq交流群
    python 魔法方法 __str__和__repr__
    python 使用for 实现死循环
    查看Django版本
    pep8 python 编码规范
    python random.randint(9,10)结果是什么?
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/3543755.html
Copyright © 2011-2022 走看看