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:

Ответ 4

Вы можете использовать собственные фабрики сокетов. Он работает нормально, он не статичен и не рекомендуется, а по отношению к системному свойству он не распространяется на всю JVM. Но дело в том, что код находится на стороне сервера.

Создание собственной фабрики сокетов RMI

Ответ 5

Конфигурация tomcat: перейдите в набор параметров vmoptions -Dsun.rmi.transport.tcp.responseTimeout = 30000 (миллисекунды)

Конфигурация websphere: выберите Серверы приложений> server1> Определение процесса> Набор виртуальных машин Java -Dsun.rmi.transport.tcp.responseTimeout = 30000 в разделе Общие аргументы JVM