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


Автор: vasko 6.5.2006, 16:00
Стоит задача в написание сервлета, который мог бы отправлять ответ клиенту асинхронно
Т.е что наподобее такого:
Код

public class HttpAgent extends HttpServlet {
      public void service(HttpServletRequest Req, HttpServletResponse Resp) {
                 // получили запрос
                 // модифицировали запрос
                 // отдали на обработку в другой модуль
                 // (вот тут проблема: обработка происходит асинхронно и ответ мне из модуля придет
                 // асинхронно.) 
                 // Как мне отправить клиенту (который у меня дернул доГет или доПост) потом ответ
      }
}
 

Автор: ALKS 6.5.2006, 16:29
а никак. клиент может к тому моменту браузер закрыть и куда ты будеш ему отправлять ответ?
 

Автор: vasko 6.5.2006, 17:01
это уже его проблемы будут.... тем более под асинронностью я не подозревал часы, тем более сутки - максимум 1-2 сек.

Правильно ли будет такой подход:
1) в методе service() сохранять (к примеру в HashMap) HttpServletResponse по уникальному ключу
2) отдавать наверх HttpServletRequest c id
3) потом, когда приложение сверху обработает HttpServletRequest и вернет мне данные достать по id HttpServletResponse 
4) Как обычно, нашпиговать HttpServletResponse данными - 
Код


public void doGet(HttpServletRequest req, HttpServletResponse resp){
       hashMap.put(key, resp);
       application.sendReq(req, key);
}


public void sendResponse(Integer key) {
       HttpServletResponse resp = (HttpServletResponse)hashMap.get(key);
       
      resp.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      out.println("bla bla");

}


Вопрос тот же, уйдет ли в методе sendResponse() ответ соответствующему клиенту? 

Автор: ALKS 6.5.2006, 17:28
не правильно. как только сервлет контейнер отпработает запрос он тут же уничтожит поток с оным. так что тот факт что ты сохраниш ссылку на уже мертвый HttpServletResponse тебе никак не поможет.
процессинг HTTP запросов синхронен. точка. ты ничего тут не сможеш зделать.

если у тебя реч идет о 1-2 секундах то не заморачивайся с асинхронностью. пусть клиент ждет.
либо тебе нужна принципиально другая технология а не сервлеты. ну  Ajax к примеру.... 

Автор: vasko 6.5.2006, 17:55
я в этом деле почти новичок... может посоветуете - необходимо реализовать Http proxy между нашим приложением и клиентом, причем обмен между разрабатываем мною модулем и нашим приложение происходит асинхронно....  
Есть ль какие идеи по дизайну приложения?
Про Ajax не слышалsmile Есть ли ссылки на книги, статьи, примеры (желательно на русском) ? 

Автор: ALKS 6.5.2006, 19:18
так стоп. твой "клиент" это человек с браузером или просто еще одна прога? если тебе необходимо организовать асинхронный обмен данными между дувумя процессами накой тебе HTTP? это и на простых сокетах запросто можно сделать. 

Автор: katala 6.5.2006, 20:41
Цитата

Про Ajax не слышал Есть ли ссылки на книги, статьи, примеры (желательно на русском) ? 

да вот это очень интересный вопрос!!!! может кто даст ссылки(если нет на русском можно и на инглише(хотя 1 вариант лучше smile) 

Автор: ALKS 6.5.2006, 20:52
да пожалуйста: http://ru.wikipedia.org/wiki/Ajax

 

Автор: vasko 11.5.2006, 14:08
Почитал про AJAX. В принципе это то, что нужно. Одно только маленькое но.
1) Клиент общается с серверным приложением асинхронно - ОК, то что нужно
2) Приложение, с которым оно общается - это скрипт (Java-script или php) - не очень хорошо, а может и совсем не хорошо, т.к:
Как я уже писал, приложение которое я должен написать - это java модуль, который должен асинхронно общаться с вышестоящим приложением. 
Получается, что я должен написать скрипт, который общается с java модулем асинхронно
                                                                                                            мой                                      Application
браузер <----асинхр.---->  Сервер. скрипт <----асинхр?----> java модуль <----асинхр.---->  Level

Возможно ли такое? 
Возможно ли из php (если на нем написан скрипт) подключиться, не создать, а именно подключиться к jvm? И если да, то как лучше реализовать взаимодействие java -> php? 
Как работать php -> java вроде бы понятно, если разобраться с подключением к jvm 

Автор: vasko 11.5.2006, 15:35
Вопрос в догонку по AJAX
можнол ли в методе XMLHttpRequest.open() обращаться не к скрипту а к java модулю?
например так:
XMLHttpRequest.open("GET", "http://kto-to.ru/my_module.jar", true); 

Автор: batigoal 11.5.2006, 15:53
Сомневаюсь. Думаю, веб-сервер в ответ на это честно постарается вернуть сам файл. 

Автор: UnicornMirage 11.5.2006, 15:55
выложу и свои сссылки, которые удалось насобирать по аяксу:

Frameworks, examples:
http://ajaxpatterns.org/Java_Ajax_Frameworks
http://ajaxpatterns.org/Java_Ajax_Frameworks
http://backbase.com/
http://backbase.com/demos/explorer/#examples/show-hide.xml[4]
http://www.google.com/webhp?complete=1
http://www.sphericalmatrix.com/
http://prototype.conio.net/

Статьи, материалы:
http://www.dklab.ru/lib/Subsys_JsHttpRequest/ 
http://webmascon.com/topics/technologies/13a.asp
http://nbsp.ru/articles/2005/01/27/dinamicheskaya_zagruzka_dannyh_s_pomoshyu_httprequest.html
http://developer.apple.com/internet/webcontent/xmlhttpreq.html 

Автор: ALKS 11.5.2006, 16:00
ребят Ajax это просто концепция. но есть реализующие эту концепцию фрейворки для Java. 
В простейшем случае ну есть у вас аплет который висит незаметно в браузере и постоянно комуницирует с серверной сторой ну для простоты путем тем же HTTP реквестов  к сервлету. ну скажем для совсем простоты каждые 0.5 секунды он спрашивает сервлет готово ли то самое асинхронрое задание smile и когда готово - аплет выкидывает ошарашенному пользователю в браузе сообщение - "готово! кликай сюды чтобы забрать".

Но все эти детали зависит уже от фреймворка который вы выберете. выбирайте и разбирайтесь smile 

Автор: UnicornMirage 11.5.2006, 16:04
какие фреймворки работают с аяксом? 

Автор: ALKS 11.5.2006, 16:12
не "работают", а "реализуют концепцию". c AJAX нельзя работать smile это абстрактый подход к разработке вэб приложений - не более.

UnicornMirage,  ты же сам линков накидал. ну вот тебе еще: http://getahead.ltd.uk/dwr/ 

Автор: vasko 11.5.2006, 16:27
проблема то не на уровне сервер-клиент реализовать асинхронность (это ajax позволяет)
а на уровне сервер - мой java модуль. Просто напомню задачу, может с помощью другой технологии это можно реализовать.

Мне необходимо реализовать java модуль который должен получать/отвечать Http запросы от клиента в асинхронном режиме. Java модуль не может быть JavaScriptom или php, это должно быть java приложение
 

Автор: ALKS 11.5.2006, 16:49
эм... запутался окончательно smile

что такое "твой java модуль" и  "твой сервер"? если "сервер" тоже на Java. то твой "java модуль" может представлять из себя Message Driven Bean. Т.е. на лицо классический асинхронный обмен данным посредством очереди сообщений.

пойдет??? 

Автор: vasko 11.5.2006, 17:26

под сервером я имею ввиду сервер Apache, и.т.д.

Сервер в цепочку я уже вставил......

Реквариементс от начальства был в двух словах: Асинхронный Http Adapter.
Должен уметь принимать Http запросы и отвечать на них асинхронно

Вот и все что у меня есть.... на выходе чз 3 недели должен быть java модуль, а я еще пока технологию просечь/прикрутить не могуsmile 

Автор: ALKS 11.5.2006, 17:30
в конце второй страницы от тебя наконец-то добились чего-то начинающего напоминающего постановку...
"Асинхронный Http Adapter" эээ между чем и чем? Apache к Java отношения не имеет. это HTTP сервер. что под ним? сервлет контейнер? полноценный апп сервер? блин тебе можно 10000 технологий перечислять. но вопрос в том что у тебя уже есть???
что ты можеш исползовать? 

Автор: vasko 12.5.2006, 09:29
Бывалый, мне бы хотя бы одну технологиюsmile

Асинхронный Http Adapter должен находиться между клиентом (браузером) и нашим приложением. 
Нашему приложению для нормального функционирования до сих пор HTTP сервер и 
полноценный апп сервер не требовались. 

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

Автор: ALKS 12.5.2006, 10:32
vasko ты не обижайся но с такой постановкой, я пы послал твое начальноство на 3 буквы. потому что понять что делать и зачем это надо - невозможно.

Итак если я понял у вас есть какая-то система не имеющая вэб интерфейса (так? потому что без HTTP сервера это как-то не очень возможно) теперь вы хотите к ней вэб интрефейс прикрутить. внимание вопрос - какие интерфейсы ваша система держит? как с ней обменеваться данными можно?  

Автор: vasko 12.5.2006, 11:08
Я б с радостью, да еще не времяsmile

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

Автор: ALKS 12.5.2006, 12:00
КАК? как ты ему асинхронно можеш данные послать? и каким образом у тебя дернут метод? твой модуль и старая программа это же разные процессы (или нет?) как они взаимодействуют? 

Автор: vasko 12.5.2006, 14:22
Есть наше ПО, реализованное на java. В нем один из модулей - Adapter Loader
который умеет создавать BaseAdapter's и у него есть public метод request(Object o) с помощью которого можно складировать к нему в очередь запросы

В - мой модуль, унаследовавший от интерфейса BaseAdapter public метод response(Object o)


Adapter Loader создает объект В: В в = new В(this);

при получении http запроса от клиента я вызываю request() на Adapter Loader. Этот метод складирует мое сообщение в очередь AdapterLoader, которая обрабатывается им асинхронно.

Как Adapter Loader обработает данные, он дернет у меня метод response() после чего я должен отправить его ответ клиенту. 

Автор: ALKS 12.5.2006, 15:03
ну вот и все. я представляю себе примерно так:

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

получив реквест мы тут же его синхронно разбираем и "вызываем  request() на Adapter Loader"
(я так понимаю там должен быть какой-то ключ. уникальтный номер задания, потому что когда у тебя  дернут response() тебе должны сказать: вот вам результат в соответствии с таким-то заданием. причем тебе этот ключ должен быть известен. ну предполагаю что "вызов  request() на Adapter Loader" вернет тебе номер задания, либо ты должен сам номер сгенерировтаь зарание и передать как один из параметров в этот  request() ) 

после вызова request()  отсылаем ему респонс назад - типа, спасибо получили запрос - вот вам ваш номер задания.

Зачем тебе уникальный номер задания? чтобы хранить информацию о том, что "ждем результаты задания такого-то от клиента такого-то".

получив результат (ну когда у тебя вызвали response() ). ты его помешаеш в свою таблицу ожидающих запросов.

все это время тебя клиент каждые 0.5 сек спрвашивает: мое задание с ключём таким-то готово? ты каждый синхронно смотриш готово оно или нет. если готово - отсылаеш ему тут же результаты и вытераеш информацию о задании. оно готово и возвращено вопрашающему, тебя оно больше не интересует.

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




 

Автор: COVD 12.5.2006, 15:13
сервлет принимает реквест от клиента, затем этот реквест пересылается в очередь на исполнение, а сам поток (сервлета) ставится в ожидание.  Когда приходит респонс, то поток выводится из wait с помощью notify и отсылает респонс обратно клиенту (браузеру).

АдаптерЛоадер должен знать кому вернуть респонс, т.е.  какой поток сервлета разбудить. Поэтому когда ему реквест на обработку отсылается, вместе с реквестом надо отсылать и ссылку на поток или связанный с ним обьект. Наверное, этот ваш модуль В и может служить таким обьектом. Для каждого потока сервлета , т.е. для каждого реквеста надо создавать этот обьект.

(пока я писал, ALKS более подробно ответил smile)    

Автор: ALKS 12.5.2006, 15:30
COVD, но если ты поток с сервлетом повесиш в ожидание, то и браузер тоже будет висеть в ожидании распоса это раз. а два твой сервлет контейнер начнет плодить потоки с сервлетами для других запросов и вообще - это ужастно smile 

Автор: COVD 12.5.2006, 15:56
Цитата

это ужастно 

это просто для понимания основ. smile  

Автор: ALKS 12.5.2006, 16:03
хотя на самом деле если как утверждает, vasko, у него возврат результатов произходит в течении 1-2 секунд то и не такая плохая мысль smile 

Автор: VSergeyV 13.5.2006, 09:16
Меня вот тоже интересует вопрос, может ли сервлет перезагрузить ранее отосланный ответ броузеру, т.е. перезагрузить страницу в броузере? 

Автор: batigoal 13.5.2006, 10:33
Цитата(VSergeyV @  13.5.2006,  10:16 Найти цитируемый пост)
Меня вот тоже интересует вопрос, может ли сервлет перезагрузить ранее отосланный ответ броузеру, т.е. перезагрузить страницу в броузере?  

Сам - нет. Инициатива должна исходить от клиента, это принцип протокола HTTP. Так что приходится искать обходные пути, типа периодических опросов, удержания постоянно открытых соединений и т.п. 

Автор: vasko 15.5.2006, 10:00
Перелопатил довольно много по этому вопросу, и склоняюсь к мысли, что идея Бывалого
наиболее подходящая.

Остается маленький вопрос - как скрестить бульдога с носорогомsmile

Приложение, разрабатываемое мною должно быть написано на java. С другой стороны оно должно уметь перехватывать Http запросы (GET, POST....). Я так понимаю что лучше приложение создавать как сервлет?  

Автор: batigoal 15.5.2006, 10:32
Цитата(vasko @  15.5.2006,  11:00 Найти цитируемый пост)
Перелопатил довольно много по этому вопросу, и склоняюсь к мысли, что идея Бывалого
наиболее подходящая.

vasko, "Бывалый" - это статус. Ник пишется выше, над аватаром. Видимо, ты обращался к ALKS'у. smile
 

Автор: vasko 15.5.2006, 11:00
Пардон, не ту инфу запастил, конечно я имел ввиду ALKS smile 

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