2019独角兽企业重金招聘Python工程师标准>>>

jmx rmi 穿越防火墙问题及jmxmp的替代方案 博客分类: java

前段时间遇到jmx使用rmi协议进行连接穿越防火墙的问题,查了很久终于查到了原因。

1.     对rmi的工作方式进行了了解,发现jmx如果采用rmi作为传输协议的话,客户端需要进行两个连接,如:JMXConnectorServer的JMXServiceURL为如下形式:service:jmx:rmi://localhost:5000/jndi/rmi://localhost:6000/jmxrmi

则首先客户端连接到rmiregistry上得到真实服务器的stub(如rmi://localhost:6000/rmxrmi),然后客户端再根据该stub连接到真实的服务器上(如rmi://localhost:5000)。如果jmx服务端省略了蓝色部分的标注,默认的通信端口是随机产生的。针对目前现网的情况,如果现网只开放了一个注册端口,如果要通过防火墙进行通信还需要开放一个通信端口,另外jmx服务端也需要固定通信端口。

通过在防火墙上开放两个端口一般能够解决穿越防火墙的问题,但针对防火墙做了内外网IP映射情况,还需要增加额外的配置,使服务端带回的stub为外网IP而非内网IP ,System.setProperty("java.rmi.server.hostname","外网IP");比解决方案没有验证,具体可参见http://blog.csdn.net/ktyl2000/article/details/4485896

2  为避开rmi穿越防火墙问题,通常采用jmx消息协议(jmxmp)来代替rmi,使用jmxmp协议较为简单,并且服务端不需要进行端口注册过程,使用jmxmp的相关代码如下:

服务端:

public class TestJmxmpServer {
  public static void main(String[] args)throws IOException{
 MBeanServer platform = ManagementFactory.getPlatformMBeanServer();
     String serviceURL="service:jmx:jmxmp://localhost:9877/ogsi";
    JMXConnectorServer connectServer = JMXConnectorServerFactory.newJMXConnectorServer(new JMXServiceURL(serviceURL), null, platform);
     connectServer.start();
     System.out.println("server start success");
 }
 
  }

客户端:

public class TestClient {
  public static void main(String[] args){
 try {
JMXConnector jmxConnector = JMXConnectorFactory.connect(new JMXServiceURL("service:jmx:jmxmp://localhost:9877/osgi"));
MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();
if(mbsc!=null){
System.out.println("success");
}
 } catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  }
}

为了支持jmxmp协议,客户端和服务端均需要增加jmxremote_optionnal.jar

3  由于我运行的程序均在OSGI环境下作为独立bundle进行启动,开发为bundle的过程中,由于类加载问题,通常要么提示不支持jmxmp,要么找不到一些其他类。

针对这两个问题:

客户端的修改:

要支持jmxmp协议,需要在客户端连接之前设置环境map,如:

Map<String, Object> env = new HashMap<String, Object>(); 
       env.put(JMXConnectorServerFactory.PROTOCOL_PROVIDER_PACKAGES,   "com.sun.jmx.remote.protocol.jmxmp"); 否则可能加载不到jmxmp相关的connector

另外jmx类加载过程中按照双亲委派机制,加载不到javax开头的包中的类,因此在客服端环境map中还需要设置默认类加载器

env.put(JMXConnectorServerFactory.DEFAULT_CLASS_LOADER,JMXConnectorServerFactory.class.getClassLoader());

客户端连接的代码第二个参数改成环境map,如JMXConnectorFactory.connect(new JMXServiceURL(jmxUrl),env);

并且客户端实际需要三个jar包 jmxremote_optional.jar 、jmxremote.jar、jmxri.jar

服务端的修改:

服务端代码不需要修改,除了jmxremote_optional.jar外,还需要增加jmxremote.jar这个包。

根据此可以在OSGI环境下成功支持jmxmp协议的连接。

http://blog.csdn.net/yangyan19870319/article/details/7244403

转载于:https://my.oschina.net/xiaominmin/blog/1597133

jmx rmi 穿越防火墙问题及jmxmp的替代方案相关推荐

  1. Tomcat Firewall JMX RMI

    今天同事在现场遇到这样一个问题,堆栈如下: [2012-05-10 15:26:52,798] INFO  [main] util.RMIClientSocketFactory ClientSocke ...

  2. Java VisualVM添加远程JMX连接时提示“无法使用service:jmx:rmi:///jndi/rmi******连接到*****”

    在使用本地Java VisualVM连接测试服务器上的JVM时出现提示 无法使用service:jmx:rmi:///jndi/rmi://***.***.***.***:****连接到***.*** ...

  3. JMX学习笔记(四) JMX RMI

    连接器概念: JMX规范定义了连接器的概念(Connectors),连接器位于JMX的3层构架中的分布式服务层.连接器负责建立MBean服务器和管理应用之间的通信.连接器由一个驻留在代理层的连接器服务 ...

  4. java 防火墙_java如何穿越防火墙

    有什么方法可以让java穿越防火墙呢?小编来告诉你!下面由小编给你做出详细的java穿越防火墙方法介绍!希望对你有帮助! java穿越防火墙方法一: 下载与安装 建议您在继续进行线上安装之前,请先停用 ...

  5. 使用JvisualVM无法连接linux远程服务器,错误无法使用service:jmx:rmi:// /jndi/rmi://ip:port/jmxrmi

    前言 在监控java进程,使用JvisualVM连接远程服务器时,正常输入服务器的IP+端口,本来以为可以正常连接的,结果却提示错误无法使用service:jmx:rmi:// /jndi/rmi:/ ...

  6. VOIP穿越防火墙详解

    前言: VoIP 刚推出之初期,受到各种因素之干扰,以致非常难用,需要经过繁复的设定才能使用. 最常见到的是某一边的使用者的电脑设定有问题导致单边没有声音,因此收话发话两端都必须是 电脑高手才能顺利进 ...

  7. MX 连接器服务器通信错误: service:jmx:rmi

    转载:http://www.zydgbbs.com/thread-1649-1-1.html 这几天启动我们Java Web 项目,经常会出现: MX 连接器服务器通信错误: service:jmx: ...

  8. (Connection refused): service:jmx:rmi:///jndi/rmi://X.X.X.X:12345/jmxrmi

    zabbix监控Windows下Tomcat的相关问题及解决方案 问题描述: zabbix监控Tomcat时报(Connection refused): service:jmx:rmi:///jndi ...

  9. 使用ssh tunnel + sock5 穿越防火墙

    最近项目组里使用了防火墙的产品,访问网站动不动就被block,出现非法访问的页面.那个怒啊..... 开始想使用一些在线的代理服务器,没想到根本就不行.在线代理全部被屏蔽了 囧..... 查找了资料后 ...

最新文章

  1. go语言笔记——包的概念本质上和java是一样的,通过大小写来区分private,fmt的Printf不就是嘛!...
  2. leetcode算法题--反转链表
  3. JavaScript学习知识点归纳
  4. java swing 图片切换_使用Javaswing自定义图片作为按钮(原创)
  5. [ARM-assembly]-A64的load/store指令总结
  6. SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例
  7. 关于眼保健操中的轮刮眼眶
  8. 【PHP】详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI、SCRIPT_NAME、PHP_SELF区别
  9. C/C++传递二维数组[转载]
  10. 容器编排技术 -- Kubernetes kubectl create poddisruptionbudget 命令详解
  11. 阐述简称PO,VO,TO,BO,DAO,POJO
  12. 【LeetCode】【HOT】287. 寻找重复数(抽象环形链表)
  13. 50道编程小题目之【质数的个数】
  14. 13 Django组件- cookie与session
  15. 【牛客练习44:C】小y的质数(求区间内k生互斥数对数---容斥原理+质因子分解)
  16. 97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作
  17. 安装软件时提示丢失MSVCR.dll,vc++运行库的问题
  18. 艺不压身和艺多不养家
  19. 利用NTLDR进入RING0的方法及MGF病毒技术分析
  20. 命令 修复损坏的 Ubuntu 系统 ,不用重装

热门文章

  1. soap协议_Go和SOAP
  2. python opencv图像对比度增强_图像增强、锐化, Python-OpenCV 来实现 4 种方法!
  3. python 3.7.5下载_you-get简介:功能强大的命令行工具,随心所欲下载视频
  4. 以太坊钱包_最大的以太坊钱包币数量还在增加
  5. 贵港天气预报软件测试,贵港天气预报15天
  6. 深蓝学院《从零开始手写VIO》作业五
  7. 完成U-net细胞分割的一些准备
  8. 【图像分割模型】从FCN说起
  9. 中国二手房行业发展形势与“十四五”前景规划建议报告2022-2028年
  10. VC\JS Base64转码