Java RMI, интерфейс публикуется как удаленный на веб-сервере, но не должен - PullRequest
0 голосов
/ 16 мая 2011

У меня неприятная проблема, но сначала позвольте мне объяснить контекст.

Проект - простой проект, поэтому я знакомлюсь с RMI.Проект представляет собой сервер фондовой биржи и клиент, который получает данные о средствах с сервера.

Я разделил проект на 3 Java-проекта.Сервер (с MockStockMarket и Fund), клиент (имеющий классы GUI и класс для общения с сервером: BannerController) и проект с интерфейсами, которые нужны и клиенту, и серверу (IStockMarket и IFund).

Я хочу, чтобы мой bannerController общался с StockMarket, чтобы баннерный контролер получал средства.Это делается с помощью getFunds (): ArrayList.

Как видите, StockMarket должен быть удаленным, а фонд должен быть сериализуемым.

Проблема по какой-то причине, когда я использую следующий код:

IStockMarket market = new MockStockMarket();
Naming.rebind("rmi://localhost/StockMarket", market);

И IStockMarket (как предполагалось), и IFund (не как предполагалось) становятся удаленными.Это не то, что я хочу.

Для справки: Фонд реализует IFund, который расширяет Serializable (так что ничего удаленного), а MockStockMarket расширяет UnicastRemoteObject и реализует IStockMarket, который расширяет Remote.

Вотснимок экрана для веб-сервера, публикующего оба интерфейса: http://imageshack.us/m/194/4755/rmibothinterfacespublis.png.

Для кода Sour: https://rapidshare.com/files/2085773800/stockmarket.zip

Ответы [ 3 ]

1 голос
/ 17 мая 2011

И IStockMarket (как предполагалось) И IFund (не по назначению) становится удаленным.

Нет, они этого не делают. Объекты только «становятся удаленными» при экспорте, а интерфейсы вообще не «становятся удаленными». IFund нужен клиенту, предположительно потому, что он появляется в интерфейсе IStockMarket. Вы, кажется, используете функцию кодовой базы. С точки зрения кодовой базы Реестр тоже является клиентом. Таким образом, Реестр скачал IFund.class и IStockMarket.class. Это не делает IFund «отдаленным» ни в какой форме или форме.

1 голос
/ 16 мая 2011

Привязка службы RMI к порту отличается от публикации файлов веб-сервера. Прикрепленный скриншот показывает, что ваши файлы IStockMarket.class и IFund.class представлены как ресурсы HTTP, которые не имеют никакого отношения к «привязке» службы RMI. Не стесняйтесь добавлять больше деталей к вопросу, если моя интерпретация здесь неправильна, и я постараюсь ответить на них.

0 голосов
/ 17 мая 2011

Я нашел его на сайте оракула: http://download.oracle.com/javase/tutorial/rmi/implementing.html.

Веб-сервер публикует мой интерфейс IFund (не удаленный), поскольку он передается методом RMI. Мой клиент нуждается в IFund для использования переданного объекта. Я думал, что этого достаточно для работы RMI.

Чего я не знал, так это того, что клиенту ТАКЖЕ нужно загрузить реализацию класса, чтобы он мог десериализовать объект и использовать методы скопированного объекта. Чтобы это работало, вы должны использовать менеджер безопасности на стороне клиента. Что очень просто:

if (System.getSecurityManager() == null) 
{
    System.setSecurityManager(new SecurityManager());
}
...