Загрузка интерфейса RMI - PullRequest
0 голосов
/ 07 января 2010

Есть вопрос, связанный с тем, как RMI загружает классы интерфейса.

Итак, вот моя установка:

Интерфейс, который определяет операцию, выполняемую сервером rmi.

Общее

public interface Computable<T> extends Remote{
    public AnalyticalServiceOutput<T> compute(Request request) throws RemoteException;
}

Сервер

Computable<Map<String, String>> stub = (Computable) UnicastRemoteObject.exportObject(this, 0);
Registry registry = LocateRegistry.createRegistry(2000);
registry.rebind("myservice", stub);

Клиент

Registry registry = LocateRegistry.getRegistry(host, port);
Computable c = (Computable) registry.lookup("myservice");
AnalyticalServiceOutput<Map<String, String>> output = c.compute(request);

Для развертывания я поместил общий jar в classpath для клиента и сервера.

Когда я запустил клиент и сервер в Eclipse, он работал отлично. Чувствуя себя торжествующим, я переместил и клиента, и сервер в коробку Linux. Но теперь, когда я выполняю вызов для вычисления (запроса), клиент жалуется (ClassNotFoundException), что один из классов, определенных в общем, недоступен.

Любые идеи относительно того, что происходит.

Приветствия

1 Ответ

0 голосов
/ 18 апреля 2011

Ваш класс "AnalyticalServiceOutput" должен реализовывать интерфейс Serializable или расширять Remote. Если клиент и сервер находятся на разных компьютерах, результат должен передаваться по проводам, и это может быть сделано только с сериализуемыми классами или удаленными объектами (куда передается заглушка прокси).

...