Двунаправленная связь RMI без 2 серверов RMI - PullRequest
2 голосов
/ 17 августа 2011

Раньше я успешно использовал 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 асинхронно, однако ...

1 Ответ

0 голосов
/ 17 августа 2011

java.lang.ClassNotFoundException: com.mycompany.worker.MyWorker

Это означает, что этот класс отсутствует на узле, который пытался его десериализовать.Так что положите его туда.

То, что вы пытаетесь, сработает, брандмауэры позволяют. Если подключен Интернет, вы можете забыть об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...