Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Может ли RMI-сервер вызвать метод RMI-клиента ?


Автор: VAB 20.10.2010, 03:28
Здравствуйте!

Ситуация такая: есть RMI-сервер и RMI-клиент. Клиент вызывает методы сервера и получает все необходимые данные. Но теперь надо сделать так, чтобы после того как на сервере обновилась сумма счета пользователя, она должна обновляться в соответствующем поле в клиентской программе. Т.е. клиент должен принимать запрос от сервера.

Можно ли это сделать на RMI и как? Если нельзя, то что посоветуете выбрать?

PS Опрос клиентом сервера по периоду не подходит - возрастет ненужная нагрузка на сервер сродни DDOS-атаке.

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

Автор: sergioK 20.10.2010, 10:10
Цитата(VAB @ 20.10.2010,  03:28)
Здравствуйте!

Ситуация такая: есть RMI-сервер и RMI-клиент. Клиент вызывает методы сервера и получает все необходимые данные. Но теперь надо сделать так, чтобы после того как на сервере обновилась сумма счета пользователя, она должна обновляться в соответствующем поле в клиентской программе. Т.е. клиент должен принимать запрос от сервера.

Можно ли это сделать на RMI и как? Если нельзя, то что посоветуете выбрать?

PS Опрос клиентом сервера по периоду не подходит - возрастет ненужная нагрузка на сервер сродни DDOS-атаке.

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

то есть клиент он одновременно и клиент  и сервер , RMI это 100% 
уу Яна Дарвина в книге есть пример 

Автор: jk1 20.10.2010, 10:42
Есть такой прием, RMI Callback. Он позволяет серверу вызывать методы клиента. 
http://java.sun.com/developer/onlineTraining/rmi/exercises/RMICallback/index.html

Автор: Skipy 20.10.2010, 12:54
Цитата(jk1 @ 20.10.2010,  10:42)
Есть такой прием, RMI Callback. Он позволяет серверу вызывать методы клиента. 
http://java.sun.com/developer/onlineTraining/rmi/exercises/RMICallback/index.html

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

Добавлено @ 13:00
Цитата(VAB @ 20.10.2010,  03:28)
Можно ли это сделать на RMI и как? Если нельзя, то что посоветуете выбрать?

PS Опрос клиентом сервера по периоду не подходит - возрастет ненужная нагрузка на сервер сродни DDOS-атаке.

Можно, но не нужно. Сервер ПРЕДНАЗНАЧЕН для опросов. И при нормальном построении pull даже раз в секунду от 10000 клиентов он выдержит спокойно. 

А вот уведомление этих же 10000 клиентов раз в секунду - оно его завалит. Особенно когда пятьсот клиентов уже отвалилось, полторы тысячи сидит за прокси, у трех тысяч слабый канал и длительные задержки.  Всё это ляжет на плечи сервера - и обработка ошибок соединений, и поддержка списка активных клиентов - неблагодарное занятие, - и ожидания при передаче. 

А на деле в конце концов окажется, что обновления раз в минуту было более чем достаточно, и его можно было свободно инициировать со стороны клиента.

В общем, я Вам настоятельно рекомендую сначала сделать стандартный вариант - периодический опрос. И посмотреть, действительно ли нагрузка на сервер возрастет настолько, что с этим надо разбираться таким образом. И не является ли возрастание нагрузки следствием неграмотно написаного серверного кода.

Автор: VAB 21.10.2010, 03:39
Разобрался - во всех случаях происходит передача удаленного объекта с клиента на сервер. 
Ян Дарвина просто посмотрел, второй пример немного улучшил и упростил.
Что касается философии проектирования - есть над чем подумать. В данном случае достаточно не то что раз в минуту обновлять, а вообще предоставить пользователю самому обновлять поле. Если учесть вышесказанное про прокси и отвалившиеся клиенты, то резонно пока сделать односторонний вызов.

Благодарю всех за ответы, очень ценная для меня инфа!

 

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