Раньше я успешно использовал RMI (в Java 6) в ряде проектов, где были четко определенные отношения клиент / сервер.Когда я использовал его в предыдущих проектах, я создал четко определенный интерфейс JAR, который развертывается как на клиенте, так и на сервере, и запускаю RMI-сервер с параметром -Djava.rmi.server.codebase = ... -Djava..rmi.server.hostname = localhost -Djava.security.policy = ... \ server.policy "
Сейчас я пытаюсь использовать RMI для выполнения двунаправленной связи, чтобы построить базовый кластер,В частности, я хочу, чтобы B (рабочий «клиент») зарегистрировался на A (центральный «сервер»).Однако я хочу, чтобы B реализовал интерфейс java.rmi.Remote и передал ссылку на себя обратно A. Основные мотивы этого: * A не должен знать, где находятся все экземпляры B (они могут бытьв любом месте интернета, если это необходимо!) * Как только экземпляр B зарегистрирован с A, тогда A может управлять B (т. е. выполнять задачи на B по усмотрению A).
Моя проблема в том, что всякий раз, когда япопробуйте передать этот удаленный интерфейс (B) в качестве параметра обратно в A, я получу следующее исключение для B (но удаленный вызов будет выполнен успешно, если вместо этого я передам ноль, что делает это объяснение маловероятным: http://download.oracle.com/javase/1.4.2/docs/guide/rmi/codebase.html#section6):
ERROR com.mycompany.server.dao.ServerInterfaceImpl - RMI registerWorker() failed: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: com.mycompany.worker.MyWorker (no security manager: RMI class loader disabled)
Где: * A (реализация) = com.mycompany.server.dao.ServerInterfaceImpl * B = com.mycompany.worker.MyWorker
(Q1) Возможно лиделать то, что я описываю?Может ли кто-нибудь написать сверхосновную версию того, что я описываю (т. Е. Клиент B регистрируется на сервере A, а затем передает ссылку на удаленный интерфейс B на A, чтобы A мог управлять B)?Первоначально я предполагал, что у меня возникли некоторые неясные проблемы с опечатками / конфигурациями, но я начинаю к этому, эта задача невозможна ...
(Q2) Если то, что я пытаюсь сделать, невозможно, другая идея состоит в том, чтобыпревратить каждый экземпляр B в RMI-сервер и заставить A подключаться к B после подключения B к A. Основная причина, по которой я не хочу сделать это, заключается в том, что я ожидаю, что A и (каждыйэкземпляр) B будет разделен Интернетом, и только A будет иметь общедоступный интернет-адрес (каждый экземпляр B не будет иметь общедоступного IP-адреса и может застрять за брандмауэром (-ами), так что B будет легчеподключиться к A, а не наоборот) ... в конце концов, как только B подключится к A, я просто хочу облегчить двунаправленную связь!
(Q3) Я думал о том, чтобы битьсямежду A и B. Одной из возможностей может быть использование этих тактов для каждого B для опроса A с какой-либо выдающейся работой ... Я бы предпочел, чтобы A управлял B асинхронно, однако ...