日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jmx rmi 穿越防火墙问题及jmxmp的替代方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的jmx rmi 穿越防火墙问题及jmxmp的替代方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。