2010-07-11 5 views
1

Я успешно создал службу RMI и клиент. Я могу назвать методы и так далее. Но теперь я хотел попробовать следующее: мне нужен стандартный Java-объект, например LinkedList, который будет размещен на службе. Кроме того, я хотел «притвориться», что у меня уже есть код, который использует LinkedList. Я хочу, чтобы получить LinkedList, который фактически управляется службой, но я могу получить доступ локально, как если бы это был обычный LinkedList. Кроме того, я хочу выполнить минимальное ведение журнала, например, если .add() называется его записью на сервере: «Add called».Java RMI: Как передать POJO

Это не предназначено для производства, просто чтобы помочь мне понять, как это работает!

До сих пор я много пробовал. Наиболее перспективным является то, что я создал класс, который расширяет LinkedList и реализует Remote. Этот класс пытается зарегистрировать себя в реестре в конструкторе вроде этого:

try {

UnicastRemoteObject.exportObject((Remote)this); Naming.rebind("theList", (Remote)this); } catch (Exception e) { System.out.println("fail"); System.out.println(e.getMessage()); }

Я должен сделать это, потому что мне нужно продлить LinkedList, таким образом, я не могу продлить UnicastRemoteObject.

выход я получаю, когда я пытаюсь запустить это на стороне сервера:

 
fail 
Connection refused to host: 192.168.178.27; nested exception is: 
java.net.ConnectException: Connection refused 

А на стороне клиента:

 
java.lang.ClassCastException: MyList_Stub cannot be cast to java.util.LinkedList 
at $Proxy0.createList(Unknown Source) 
at RemoteProgram.main(RemoteProgram.java:27) 

Заранее спасибо!

ответ

2

То, что вы пытаетесь сделать, очень неэффективно и не очень хорошая идея. В принципе, вы можете отправить что-либо в вызове метода, который вы можете сериализовать. Если вы хотите получить хорошую производительность, я бы предположил, что у вас есть только один удаленный объект, который представляет вашу службу, и действует как фасад для всех необходимых вам услуг (каждый удаленный объект приводит к созданию отдельного дескриптора файла, поэтому наличие большого количества удаленных объектов обычно не хорошая идея). Кроме того, если вы часто добавляете и удаляете объекты, то отправка сообщения каждый раз, когда вы добавляете или удаляете элемент, не является действительно разумным. Я хотел бы предложить с одним удаленным объектом со следующими двумя очень простыми методами:

LinkedList retrieveLinkedListByName(String); 
boolean commitNewVersionOfLinkedListByName(String,LinkedList); 

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

+0

Эй, Майкл, спасибо за ответ. Но я только пытаюсь понять понятия. То, как я это задал - как бы вы это сделали, чтобы каждый раз что-то менялось, он передавался на сервер, хотя и был очень неэффективным? – partel

2
java.lang.ClassCastException: MyList_Stub cannot be cast to java.util.LinkedList 
at $Proxy0.createList(Unknown Source) 
at RemoteProgram.main(RemoteProgram.java:27) 

LinkedList - это конкретный класс, RMI работает с интерфейсами, поэтому вы должны переходить на интерфейс List на стороне клиента.

+0

... что касается отказа от отказа подключения, я бы начал изучать используемую вами политику безопасности (при отсутствии внешних проблем, таких как брандмауэры). – darri

0

Согласен с другими плакатами, это очень неэффективный дизайн.

Что касается ваших исключений, я не знаю, как вы можете получить «соединение отказано» на сервере и все еще иметь возможность запускать клиент. Вам нужно будет опубликовать трассировку стека.