Java RMI - время ожидания клиента
Я создаю распределенную систему с использованием Java RMI, и она должна поддерживать потерю сервера.
Если мой клиент подключен к серверу с использованием RMI, если этот сервер опускается (например, проблемы с кабелем), мой клиент должен получить исключение, чтобы он мог подключиться к другому серверу.
Но когда сервер опускается, с моим клиентом ничего не происходит, он все еще ждет ответа. Как установить таймаут для этого?
Ответы
Ответ 1
Для тайм-аута считывания сокетов вы можете установить свой собственный factory следующим образом:
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 );
}
} );
Ответ 2
Недавно я столкнулся с этой проблемой и обнаружил, что мне нужно установить следующее свойство Java для вызова RMI для тайм-аута на стороне клиента:
sun.rmi.transport.tcp.responseTimeout
Вот полный scoop для этих параметров в новых версиях Java:
Ответ 3
Существует системное свойство, которое вы можете установить.
Что-то вроде sun.rmi.transport.connectionTimeout
Они подробно описаны здесь:
https://docs.oracle.com/javase/7/docs/technotes/guides/rmi/sunrmiproperties.html
Ответ 4
Вы можете использовать собственные фабрики сокетов. Он работает нормально, он не статичен и не рекомендуется, а по отношению к системному свойству он не распространяется на всю JVM. Но дело в том, что код находится на стороне сервера.
Создание собственной фабрики сокетов RMI
Ответ 5
Конфигурация tomcat: перейдите в набор параметров vmoptions -Dsun.rmi.transport.tcp.responseTimeout = 30000 (миллисекунды)
Конфигурация websphere: выберите Серверы приложений> server1> Определение процесса> Набор виртуальных машин Java -Dsun.rmi.transport.tcp.responseTimeout = 30000 в разделе Общие аргументы JVM