Java RMI を使用して分散システムを構築していますが、サーバーの損失をサポートする必要があります。
クライアントが RMI を使用してサーバーに接続されている場合、このサーバーがダウンした場合 (ケーブルの問題など)、クライアントは例外を取得して、他のサーバーに接続できるようにする必要があります。
しかし、サーバーがダウンしてもクライアントには何も起こらず、応答を待ち続けます。そのタイムアウトを設定するにはどうすればよいですか?
ソケット読み取りタイムアウトについては、次のように独自のファクトリを設定できます。
RMISocketFactory.setSocketFactory( new RMISocketFactory()
{
public Socket createSocket( String host, int port )
throws IOException
{
Socket socket = new Socket();
socket.setSoTimeout( timeoutMillis );
socket.setSoLinger( false, 0 );
socket.connect( new InetSocketAddress( host, port ), timeoutMillis );
return socket;
}
public ServerSocket createServerSocket( int port )
throws IOException
{
return new ServerSocket( port );
}
} );
私も最近この問題に遭遇し、RMI 呼び出しがクライアント側でタイムアウトになるようにするには、次の Java プロパティを設定する必要があることがわかりました。
sun.rmi.transport.tcp.responseTimeout
Java の新しいバージョンでのこれらのパラメーターの完全なスクープは次のとおりです。
設定できるシステム プロパティがあります。
何かのようなものsun.rmi.transport.connectionTimeout
詳細はこちら:
https://docs.oracle.com/javase/7/docs/technotes/guides/rmi/sunrmiproperties.html