Java RMI: как определить, произошел ли сбой сервера? - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть сторонняя библиотека Java, которую я пытаюсь инкапсулировать в отдельную JVM с RMI (поскольку в библиотеке есть собственные вызовы, которые приводят к сбою JVM, и существуют приложения для запуска сервера RMI на другом компьютере).

Мое Java-приложение на стороне клиента работает следующим образом, по крайней мере, когда все работает на одном компьютере:

  1. найти объект, связанный с FooBar/<id> в реестре RMI
  2. если он уже связан с реестром, используйте его и перейдите к шагу 5.
  3. в противном случае запустите отдельную JVM для создания рассматриваемого объекта.
  4. дождитесь короткого времени ожидания
  5. найти объект, связанный с FooBar/<id> в реестре RMI
  6. , если у нас есть объект, успех!(в противном случае ошибка)

Проблема, с которой я столкнулся, заключается в том, что, когда происходит сбой другой JVM, кажется, что привязка присутствует в реестре RMI, а затем я в конечном итоге использую фантомный объект, ничем не связанный.

Можно ли каким-то образом проверить прокси-объект, связанный с реестром RMI на шаге 2, поэтому, если объект недействителен, я могу создать новый для rebind () в реестре RMI?

1 Ответ

3 голосов
/ 14 апреля 2011

установить время ожидания для ваших запросов rmi (см. здесь ). затем, если время ожидания истекло, считайте объект мертвым. Кроме того, когда мне нужен очень надежный код rmi, я оберну вызовы rmi на стороне клиента некоторой функциональностью повторов / отката (при условии, что ваши исходящие вызовы являются идемпотентными). таким образом, вы пытаетесь подключиться несколько раз с задержками между ними, прежде чем считать целевой объект мертвым.

(и нет, невозможно определить, мертв ли ​​удаленный объект, не пытаясь с ним связаться).

...