Java RMI: реализовать тайм-аут в клиентском коде - PullRequest
1 голос
/ 14 марта 2011

У меня есть система Java RMI.Ситуация типичная: клиент вызывает метод сервера.У клиента есть внутренний таймер, поэтому, если сервер не завершает свою работу вовремя (время указано в клиенте), клиент должен сделать что-то еще.

Итак, клиент должен ждатьсервер, чтобы закончить свою работу в течение определенного времени и в случае, если сервер не закончил делать что-то еще (не важно, что).How can I do this?

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

спасибо большое!

Ответы [ 3 ]

2 голосов
/ 14 марта 2011

Сделайте вызов RMI в другом потоке.Пусть исходящий поток ожидает определенное время ответа от вызывающего потока RMI.

В качестве альтернативы, пусть поток RMI сервера делегирует задачу рабочему потоку.Вернитесь к вызывающей стороне, если рабочий поток не отвечает достаточно быстро.

1 голос
/ 14 марта 2011

В общем, когда вы хотите, чтобы операции в Java были остановлены, вы говорите об одном или двух слоях синхронного / асинхронного преобразования. Я никогда не делал этого с RMI, но я думаю, что вы делаете что-то подобное. Возможно, спросить участников этого обсуждения: ( Асинхронный Java RMI ) будет полезно. Основываясь на замечаниях, сделанных в ( Spring Async RMI Call ), я бы сказал, что вам нужно сделать следующее:

  1. Вызовите службу RMI, используя отдельный поток (ы); рассмотрите возможность использования службы executor.
  2. Предоставьте это с помощью оболочки, которая обращается к службе исполнителя и блокирует конечное время для результатов; рассмотреть возможность использования фьючерсов.
0 голосов
/ 22 марта 2011

Вам необходимо установить недокументированное свойство, которое называется (я думаю) sun.rmi.transport.tcp.responseTimeout на каждой клиентской JVM.Значение в миллисекундах.

...