2011-08-17 5 views
2

Я успешно использовал RMI (в Java 6) ранее в ряде проектов, где были четко определенные отношения клиент/сервер. Когда я использовал его в предыдущих проектах, я создал четко определенный интерфейс JAR, который развертывается как на клиенте, так и на сервере, и запускает RMI-сервер с помощью «-Djava.rmi.server.codebase = ... -Djava .rmi.server.hostname = localhost -Djava.security.policy = ... \ server.policy "RMI Двунаправленная связь без 2 серверов RMI

Я пытаюсь использовать RMI для выполнения двунаправленной связи, чтобы создать базовый кластер. В частности, я хочу, чтобы B (рабочий «клиент») регистрировался в A (центральный «сервер»). Однако я хочу, чтобы B реализовал интерфейс java.rmi.Remote и передал ссылку себе обратно на A. Основными мотивами этого являются: * A не нужно знать, где находятся все экземпляры B (они могут быть в любом месте в Интернете, если нужно!) * Как только экземпляр B зарегистрировался в A, тогда A может управлять B (т. е. выполнять задания на B при дискретизации A).

Моя проблема в том, что всякий раз, когда я пытаюсь передать этот удаленный интерфейс (B) в качестве параметра обратно в A, я получаю следующее исключение в B (но удаленный вызов будет успешно выполняться, если я передам null вместо этого, что делает это объяснение маловероятно: 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, однако. ..

ответ

0

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

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

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