Можно ли прервать вызов Java RMI? - PullRequest
10 голосов
/ 28 февраля 2011

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

Ответы [ 4 ]

2 голосов
/ 28 февраля 2011

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

Библиотека состоит из двух ключевых компонентов: RMISocketFactory и ThreadFactory.Вызовы RMI, сделанные в потоке из предоставленного ThreadFactory к интерфейсу RMI с использованием сокетов из RMISocketFactory, могут быть прерваны путем вызова Thread # interrupt () в потоке клиента.Так что это действительно удобно.Но обратите внимание также на стороне сервера, что вы можете добавить вызов к удобному служебному методу, чтобы убедиться, что текущий поток не является "зомби" или потерянным потоком, который уже был "прерван" клиентом.


Программная остановка сервера RMI:

Серверы RMI запускают поток, который никогда не заканчивается.Это делается для того, чтобы сервер был постоянным до тех пор, пока не будет выключен вручную.Однако вы можете предоставить удаленный метод shutDown() для Удаленного сервера.Этот метод запускает поток завершения.Поток завершения остается в ожидании notify(). Когда Сервер заканчивает всю обработку очистки, он запускает поток завершения.

Поток завершения после двух (2) секундной задержки вызывает System.exit(0) дляконец виртуальной машины Java.Задержка заключается в том, что сообщения от Сервера инициирующему Клиенту завершают путешествие.

1 голос
/ 18 апреля 2012

java.util.concurrant явно опечатка, которая должна быть java.util.concurrent.

Но что более важно, я нигде не вижу java.util.concurrent.ExecutorService. Вы имели в виду java.util.concurrent.ExecutorCompletionService?

1 голос
/ 28 февраля 2011

Похоже, что RMI отсутствует функция .

Однако вы можете реализовать свою собственную фабрику сокетов, которая будет использоваться RMI, и установить время ожидания сокетов.Я помню, что некоторые из моих друзей делали это вручную, но я только что нашел библиотеку Interruptiblermi , которая автоматически решает эту проблему.Попробуйте и расскажите, пожалуйста, как он работает.

1 голос
/ 28 февраля 2011

Нет, interrupt() здесь не будет работать, так как RMI использует блокировку java.io, которая не прерывается.

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

В качестве альтернативы выполнить исходный вызов RMI в отдельном потоке, который вы можете затем "сбросить", если требуется.Использование java.util.concurrant.ExecutorService здесь может показаться полезным, поскольку оно позволяет вам отправить задачу и подождать некоторое время до ее завершения.Фактический вызов RMI не будет прерван, но ваша клиентская программа все еще может продолжиться.

...