2012-06-04 84 views
4

我們有一個應用程序,它使用MBeanServerConnection.invoke調用MBean上的各種遠程方法。 偶爾會有這些方法之一掛起。 有沒有什麼辦法讓通話超時?所以如果通話時間過長,它會返回一個異常。MBeanServerConnection.invoke永遠掛起

或者我是否必須將所有這些調用轉移到單獨的線程中,以便它們不鎖定用戶界面並要求終止應用程序?

回答

3

http://weblogs.java.net/blog/emcmanus/archive/2007/05/making_a_jmx_co.html

=====更新=====

我在想這個東西當我第一次回答,但我對我的手機,我不能鍵入值得一個該死的.....

這實際上是一個RMI問題,除非你使用不同的協議,否則沒有什麼可以做的,除非如你所說,將所有這些調用移入單獨的線程,他們不鎖定用戶界面。

但是....如果您可以選擇擺弄目標服務器,並且可以自定義連接客戶端,則至少有一個選項可以在目標服務器上自定義JMXConnectorServer

標準的JMXConnectorServer實現是RMIConnectorServer。其中一部分規範是,當使用任何構造函數(如RMIConnectorServer(JMXServiceURL url, Map environment))創建新實例時,環境映射可包含鍵/值對,其中鍵爲RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE,值爲RMIClientSocketFactory。因此,你可以指定一個套接字工廠方法是這樣的:

RMIClientSocketFactory clientSocketFatory = new RMIClientSocketFactory() { 
    public Socket createSocket(String host, int port) { 
     Socket s = new Socket(host, port); 
     s.setSoTimeout(3000); 
    } 
}; 

這個工廠創建一個Socket,然後使用setSoTimeout將其SO_TIMEOUT,所以當客戶端使用這個插座,所有操作,包括連接,將3000 ms後超時。

您也可以在OpenDMK的jmx-optional包中檢出JMXMP連接器和服務器。 (鏈接到我的github mavenized)。沒有內置的解決方案,請注意,但它們非常容易擴展,而JMXMP是基於TCP套接字而非RMI的簡單套件,因此這種類型的定製將變得微不足道。

乾杯。

+0

似乎歸結爲「將工作轉移到可以殺死/忽略的線程」。 – CasaDelGato

+0

查看更新的答案。 – Nicholas

+0

謝謝,這看起來很有幫助。 – CasaDelGato

1

@ Nicholas:上面的代碼不工作。我的意思是請求沒有超過3000.ms後超時。

map.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE,新的RMIClientSocketFactory(){

  @Override 
      public Socket createSocket(String host, int port) throws IOException { 
       if(logger.isInfoEnabled()){ 
        logger.info("JMXManager inside createSocket..." + host + ": port :" + port); 
        } 
        Socket s = new Socket(host, port); 
        s.setSoTimeout(3000); 
        return s; 
      } 
     }); 

     cs = JMXConnectorServerFactory.newJMXConnectorServer(url,map,mbeanServer); 
0

正如我回答了:How to set request timeout for JMX Connector的RMI特性可以幫助你的所有屬性都在Oracle文檔網站。 http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/sunrmiproperties.html

例如:-Dsun.rmi.transport.tcp.responseTimeout=60000是一個客戶端tcp響應超時。還有連接超時和服務器端連接的屬性。

我也不高興JMX/RMI/TCP堆棧如何從較低級別的協議隱藏重要設置,並使其不可用於單個連接。