Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > ListModel (поведение модели)


Автор: cube 3.10.2010, 18:40
не знаю куда лучше было бы включить этот топик


Я использую модель вид контроллер в свинге, для создания JList, JTable, JComboBox. Мое приложение это клиент-сервер, на сервере я создаю DefaultListModel (например) и через RMI в клиенте получаю ее (модель) и запихиваю в компонент (JList). Все работает отлично, я использую шаблон RMI callback, и каждый раз при изменении модели на сервере вызываю методы на клиенте и устанавливаю модель в свою компаненту.

Как сделать чтобы модель изменяемая на сервере изменялась бы сама на клиенте без вызова дополнительный методов получения новой модели с сервера?

надеюсь я понятно объяснил ;) сорри

Автор: Skipy 4.10.2010, 10:31
В теории это делается следующим образом - сервер инициирует соединение с клиентским приложением и посылает обновление. На практике - большое количество клиентов приведет к тому, что сервер будет непрерывно рассылать уведомления, при том, что с большой вероятностью они клиенту не нужны (к тому моменту, когда понадобятся новые данные, клиент уже получит 20-30-40 обновлений вместо одного, по запросу)

Вам это вообще зачем? Чем не устраивает запрос модели?

Автор: cube 4.10.2010, 18:56
Цитата(Skipy @ 4.10.2010,  10:31)
В теории это делается следующим образом - сервер инициирует соединение с клиентским приложением и посылает обновление. На практике - большое количество клиентов приведет к тому, что сервер будет непрерывно рассылать уведомления, при том, что с большой вероятностью они клиенту не нужны (к тому моменту, когда понадобятся новые данные, клиент уже получит 20-30-40 обновлений вместо одного, по запросу)

Вам это вообще зачем? Чем не устраивает запрос модели?

Это самая лажовая реализация. 

Сейчас у меня приложение работает так:
Загружается сервер, загружает данные с бд в память в ввиде объектов, загружаются клиенты, находят сервер в сети. Вызывают с сервера объекты в виде модели (TableModel ListModel и т.п.), отображают на экране, после любо1 из клиентов изменяет данные. Сервер производит сохранение данных и у всех клиентов дергает метод отвечающий за обновления этого типа данных (например списка услуг, списка книг, списка городов, т.п.) все клиенты обращаются к серверу и получают новую модель и устанавливают ее в свой граф интерфейс.

Как сделать чтобы модель данных обновлялась на клиенте динамически? (не вызывая дополнительных методов на клиенте) Есть решение? 

Ведь я передаю 1 раз в самом начале модель данных графического интерфейса и по ссылке устанавливаю ее клиенту, после этого только сервер изменяет эту модель. Но на клиентах она не меняется, а по идеи должна. =)

! Я подозреваю что при передачи модели по сети происходит сериализация объекта, поэтому клиент получает как бы не ссылку на объект, а совершенно новый объект модели, естественно при таком раскладе, любые дальнейшие изменения модели на сервере не повлияют на модель которая находится у клиента.


Автор: COVD 4.10.2010, 19:12
"distributed cache",  "distributed memory" -  http://www.hazelcast.com/, http://www.terracotta.org/, e.t.c.

Автор: cube 4.10.2010, 19:15
представьте (если так будет понятней) вы делаете программу чат =)

Список сообщений храните на сервере, у вас 2 клиента которые ведут диалог. Каждый клиент отображает у себя список сообщений, имеет поле ввода нового сообщение и кнопку отправить.

На клиентах JList отображает сообщения, DefaultListModel модель сообщений хранящаяся на сервере, бд у вас нет (нет задачи сохранять мессаджи).

Как бы вы поступили в данной ситуации? спасибо

Автор: cube 4.10.2010, 19:41
Цитата(COVD @ 4.10.2010,  19:12)
"distributed cache",  "distributed memory" -  http://www.hazelcast.com/, http://www.terracotta.org/, e.t.c.

Спасибо, но вы знаете я пока посмотрел hazlcast. Я могу вам с уверенностью сказать - да, вот это я реализовал. Уже достаточно давно в своей программе, вот этого я и добиваюсь, вот только чтобы клиент динамически реагировал на изменение модели данных они везде используют листенеры. Это не удобно, не практично. Да, это динамично, но не удобно!

У меня приложение 45 объектов. В программе мне приходится создавать 45 слушаетелей и вешать их на клиенты, 45 методов чтоб получать на клиентах модели.

Это все работает, также как и с hazlcast, тоже rmi callback. Я хоч упростить, "облегчить" свой код, упростить создание новых объектов и их связей в системе, использование hazlcast тоже самое что и сейчас у меня - проблему не решает =(((

Вторую ссылку сейчас посмотрю. Спасибо Вам еще раз.

Автор: COVD 4.10.2010, 19:45
Цитата

В программе мне приходится создавать 45 слушаетелей и вешать их на клиенты


Да, на каждую коллекцию ("список" или Map) нужен слушатель и у него 4 метода : entryAdded(EntryEvent ee) , entryRemoved(EntryEvent ee) , entryUpdated(EntryEvent ee), entryEvicted(EntryEvent ee) . И это правильно. Что тут неудобного.
Другое дело, что клиент, защищенный файерволом, возможно не сможет участвовать. 




Автор: cube 5.10.2010, 20:21
Цитата(COVD @ 4.10.2010,  19:45)
Что тут неудобного.

В том что у меня на сервере есть свои листенеры, которые отвечают за сохраноость данных в базе и изменения модели. При изменение объекта, удаление его, они и вызывают определнные методы. 

Согласитесь не удобно:

Изменился объект Город, он сообщил об этом СпискуГородов, изменил свою модель, записал в бд, СписокГородов сообщил Серверу, Сервер сообщил подключенным к нему клиентам, клиенты если работают с этим списком запросили новую модель и установили себе.

Удобно:

Изменился объект Город, он сообщил об этом СпискуГородов, изменил свою модель, записал в бд.

(СписокГородов больше никому ничего не сообщает! Клиенты уже давно получили на него ссылку и работают только с моделью данных, которая менятеся на сервере, и все листенеры там)

спасибо за помощь, покапаюсь может что-то упрощу в своем коде.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)