我們有一個應用程序,它使用MBeanServerConnection.invoke調用MBean上的各種遠程方法。 偶爾會有這些方法之一掛起。 有沒有什麼辦法讓通話超時?所以如果通話時間過長,它會返回一個異常。MBeanServerConnection.invoke永遠掛起
或者我是否必須將所有這些調用轉移到單獨的線程中,以便它們不鎖定用戶界面並要求終止應用程序?
我們有一個應用程序,它使用MBeanServerConnection.invoke調用MBean上的各種遠程方法。 偶爾會有這些方法之一掛起。 有沒有什麼辦法讓通話超時?所以如果通話時間過長,它會返回一個異常。MBeanServerConnection.invoke永遠掛起
或者我是否必須將所有這些調用轉移到單獨的線程中,以便它們不鎖定用戶界面並要求終止應用程序?
見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的簡單套件,因此這種類型的定製將變得微不足道。
乾杯。
@ 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);
正如我回答了: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堆棧如何從較低級別的協議隱藏重要設置,並使其不可用於單個連接。
似乎歸結爲「將工作轉移到可以殺死/忽略的線程」。 – CasaDelGato
查看更新的答案。 – Nicholas
謝謝,這看起來很有幫助。 – CasaDelGato