Java RMI - время ожидания клиента - PullRequest
13 голосов
/ 01 декабря 2009

Я строю распределенную систему с использованием Java RMI, и она должна поддерживать потерю сервера.

Если мой клиент подключен к серверу с помощью RMI, если этот сервер выходит из строя (например, проблемы с кабелем), мой клиент должен получить исключение, чтобы он мог подключиться к другому серверу.

Но когда сервер отключается, с моим клиентом ничего не происходит, он продолжает ждать ответа. Как я могу установить тайм-аут для этого?

Ответы [ 5 ]

15 голосов
/ 01 декабря 2009

Для тайм-аута чтения сокета вы можете установить свою собственную фабрику следующим образом:

           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 );
                }
            } );
12 голосов
/ 16 октября 2012

Недавно я также столкнулся с этой проблемой и обнаружил, что мне нужно установить следующее свойство Java для тайм-аута вызова RMI на стороне клиента:

sun.rmi.transport.tcp.responseTimeout

Вот полная информация об этих параметрах в новых версиях Java:

7 голосов
/ 01 декабря 2009

Существует системное свойство, которое вы можете установить.
Что-то вроде sun.rmi.transport.connectionTimeout

Они подробно описаны здесь:
http://java.sun.com/j2se/1.4.2/docs/guide/rmi/sunrmiproperties.html

0 голосов
/ 25 декабря 2018

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

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

0 голосов
/ 28 октября 2018

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

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

...