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