Java RMI: как передать POJO - PullRequest
       24

Java RMI: как передать POJO

1 голос
/ 11 июля 2010

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

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

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

try {</p> <p>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)

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

Ответы [ 3 ]

2 голосов
/ 11 июля 2010
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 на стороне клиента.

2 голосов
/ 11 июля 2010

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

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

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

0 голосов
/ 12 июля 2010

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

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

...