Загрузка интерфейса RMI

Есть вопрос, связанный с тем, как 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 в путь к классам как для клиента, так и для сервера.

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

Любые идеи о том, что происходит.

Ваше здоровье


person CaptainHastings    schedule 06.01.2010    source источник
comment
Доступен ли общий класс Computable в пути к классам как на клиенте, так и на сервере?   -  person Mark    schedule 07.01.2010
comment
да. Он доступен в пути к классам. Кроме того, к вашему сведению, я запускаю реестр rmi с сервера, используя Registry register = LocateRegistry.createRegistry(2000);   -  person CaptainHastings    schedule 07.01.2010


Ответы (1)


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

person MHofmann    schedule 18.04.2011