MBeanServerConnection.invoke を使用して MBean でさまざまなリモート メソッドを呼び出すアプリがあります。これらのメソッドの 1 つがハングすることがあります。通話をタイムアウトにする方法はありますか? 呼び出しに時間がかかりすぎる場合に例外が返されるようにするには?
それとも、これらのすべての呼び出しを別のスレッドに移動して、UI をロックしたりアプリを強制終了したりしないようにする必要がありますか?
http://weblogs.java.net/blog/emcmanus/archive/2007/05/make_a_jmx_co.htmlを参照してください。
=====更新=====
最初に返信したとき、このことについて考えていましたが、携帯電話を使用していたので、まったく入力する価値がありません.....
これは実際には RMI の問題であり、別のプロトコルを使用しない限り、できることはあまりありませんが、あなたが言うように、これらの呼び出しをすべて別のスレッドに移動して、UI をロックしないようにする必要があります。
しかし....ターゲットサーバーをいじるオプションがあり、接続クライアントをカスタマイズできる場合、 ターゲットサーバーでJMXConnectorServerをカスタマイズするオプションが少なくとも1つあります。
標準の 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 ミリ秒後にタイムアウトします。
OpenDMKの jmx-optional パッケージでJMXMPコネクタとサーバーをチェックアウトすることもできます。(リンクは私のgithub mavenizedへのものです)。組み込みのソリューションはありませんが、拡張が非常に簡単で、JMXMP は RMI ではなく単純な TCP ソケット ベースであるため、この種のカスタマイズは簡単です。
乾杯。
@ Nicholas : 上記のコードが機能していません。つまり、リクエストが 3000 ミリ秒後にタイムアウトにならないということです。
map.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE , new 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);
私が答えたように:JMXコネクタのリクエストタイムアウトを設定する方法 RMIプロパティが役立ちます。すべてのプロパティは、Oracle ドキュメント サイト http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/sunrmiproperties.htmlにあります。
例:-Dsun.rmi.transport.tcp.responseTimeout=60000
クライアント側の tcp 応答タイムアウトです。接続タイムアウトとサーバー側接続のプロパティもあります。
また、JMX/RMI/TCP スタックが下位レベルのプロトコルから重要な設定を隠し、単一の接続で使用できないようにする方法にも満足していません。