Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Организация нотификации пользователя


Автор: Luceus 28.1.2008, 15:32
Всем добрый день!

Подскажите, пожалуйста, где копать, что бы можно было реализовать следующее. Необходимо, чтобы при выполнении какой-то операции на сервере, пользователю в браузер отправлялся XML с информацией о выполняемых тасках на сервере. Например, пользователь нажал создать объект. Сервлет принял эту информацию, и начал обрабатывать действие. И уведомляет об этом пользователя. Пользователь может выключить браузер, и запустить его позже, с продолжением получения информации о выполняемых работах. Как это реализовать?

Аналогично, другое. Пользователь вводит логин и пароль. Переходит на страницу чата. Тем временем на стороне сервера произошел коннект с чат-сервером, и постоянно поддерживается коннект. И лишь время от времени на странице пользователя происходит запрос о новых сообщениях, и если таковые имеются, возвращается XML.

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

Автор: nornad 28.1.2008, 16:56
В случае браузера инициатором является всегда клиент, так что только вариант, когда на клиенте регулярно вызывается некий метод, который спрашивает сервер, нет было ли чего интересного в последнее время.

Автор: Luceus 28.1.2008, 17:24
nornad, согласен. Так а как сохранить на стороне сервера тоже соединение с сервером ICQ, что бы с определенной периодичностью можно было запрашивать данные о состоянии из браузера?? Я так понимаю, что после того, как тот же сервлет передает информацию клиенту, инстанс его освобождается.

Автор: batigoal 28.1.2008, 21:00
Цитата(Luceus @  28.1.2008,  18:24 Найти цитируемый пост)
Я так понимаю, что после того, как тот же сервлет передает информацию клиенту, инстанс его освобождается. 

Освобождается, конечно - ведь его цикл завершен. Но ничто не мешает запустить на сервере какой-то "вечный" класс (который отнюдь не обязан быть сервлетом) и из его недр удерживать открытые коннекты к асечному серверу.

Автор: Luceus 29.1.2008, 13:43
batigoal, вот как раз я об этом smile Есть ли пример, как сделать подобный вечный класс, который бы занимался фоновой обработкой. И не только, напрмер, поддерживал связь с сервером, но также и производил какие-то запланированные работы. Спасибо.

 smile 

Автор: batigoal 29.1.2008, 14:55
Дык, а какой тут нужен пример? smile Класс с бесконечным циклом, начинающий свою работу при инициализации контекста приложения и завершающий при его убиении.

Автор: Luceus 29.1.2008, 19:06
batigoal, может я не корректно задал вопрос. Если это не сервлет, то каким образом его запускать в сервере приложений? Я только начинающий, и поэтому спрашиваю всякие глупости.

Спасибо.

Автор: Stampede 29.1.2008, 19:53
Цитата(Luceus @  29.1.2008,  03:43 Найти цитируемый пост)
Есть ли пример, как сделать подобный вечный класс, который бы занимался фоновой обработкой. И не только, напрмер, поддерживал связь с сервером, но также и производил какие-то запланированные работы. Спасибо.


Туь можно предложить примерно такую архитектуру.

Создаем в базе очередь сообщений, скажем,  вида (msg_id, msg_time, msg_user_id, msg_text). Заполняем какими-то данными. Например, пишем тестовый генератор, который добавляет по одному сообщению в минуту.

Теперь самое интересное: как это выдать юзеру. Довольно просто на самом деле. Юзер через XMLHttpRequest выдает запрос по адресу, скажем, /messages.do?uid=1234.

По этому запросу запускается сервлет, который и будет этим самым "вечным классом", как ты изволил выразиться. Его задача - выдать в выходной поток все юзерские сообщения, которые накопились к данному моменту, и после этого не закрывать поток, а ждать поступления новых собщений для данного юзера (эту часть можно реализовать через wait/notify). Таким образом сервлет будет висеть в памяти до тех пор, пока юзер не закончит сессию/закроет браузер.

Что касается прослушивания линии на стороне браузера, т. е. обработки поступающих сообщений в ответе XMLHttpRequest, то там не все так просто. Вот тут можно найти обсуждения варианта транспорта:
  • http://www.bluishcoder.co.nz/2005/11/more-on-ajax-and-server-push.html.
  • http://ejohn.org/blog/streaming-http-server-push/
  • http://ajaxpatterns.org/HTTP_Streaming
Ну и гуголь в руки, разумеется smile

Автор: Luceus 29.1.2008, 22:04
Всем спасибо. Я нашел решение. Необходимо при создании сервлета имплементировать интерфейс Runnable. Этим самым мы говорим, что сервлет будет работать в фоновом режиме. Если мы хотим, что бы этот скрипт запускался сразу, как только будет стартанут сервер, необходимо в web.xml прописать <load-on-startup/>

Вопрос снят. smile

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