|
|
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть такая модель: 1. Есть сервлет. Он должен принимать соединения от клиентов, как то идентифицируя их 2. Клиенты посылают данные на сервлет, он их обрабатывает и возвращает ответ, формат которого пока не ясен 3. Время обработки сервлетом данных может варьироваться. Клиенты должны иметь возможность опрашивать сервлет, получая часть готовых данных. Ну, по аналогии с ajax технологией. Т.е. данные у клиентов должны отображаться по мере их готовности на сервлете. Я пока только вникаю в технологию, т.е. сами понимаете, опыта нет, пока сложно мыслить "в среде" так сказать. 1. Из прочтения документации JEE по сервлетам я понял, что каждый раз, при подключении НОВОГО клиента, создается новый экземпляр сервлета. Базовая идентификация уже есть, на основе sessin id . Т.е. я понимаю так: при подключении клиента к сервлету, он должен сохранять у себя SID и передавать его в хедерере при новом подключении. Верно? 2. Обрабатываться информация должна в новом созданном потоке. Могу же я из сервлета создать несоклько потоков? А завершать их по заданному значению таймера допустим, что бы если клиент потерян (отключился по неизвестным причинам) ресурсы не использовались зря. Или, сервлет сам высвободит дочерние ресурсы по таймауту (session timeout)? 3. Данные, думаю, возвращать лучше в виде xml, а клиент должен будет парсить новый xml при опросе сервлета и обновлять свои результаты. Не изобретаю ли я велосипед тут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2012, 22:50:59 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
mr.Jack, ты всё усложняешь. Сервлет - это кусок кода - процедура на Java которая может вызываться из потока (не ты решаешь). А принцип Веба - "спросил и забыл" Т.е. НЕ идентифицировать клиента. Из этого и исходи - докажи что тебе нужна идентификация по БЛ. автор3. Время обработки сервлетом данных может варьироваться. Клиенты должны иметь возможность опрашивать сервлет, получая часть готовых данных. Ну, по аналогии с ajax технологией. Т.е. данные у клиентов должны отображаться по мере их готовности на сервлете. нет. Нужно стремиться сделать время ответа сервлета - 0.0001 сек. Тогда твой вопрос сам собой отпадёт. ______________________________________________ "Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн. AutoPOI.ru — ГИС-технологии для Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 10:23:40 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
mr.Jack1. Из прочтения документации JEE по сервлетам я понял, что каждый раз, при подключении НОВОГО клиента, создается новый экземпляр сервлета. Это не так. Приведите цитату из документации по которой вы это поняли. mr.JackБазовая идентификация уже есть, на основе sessin id . Т.е. я понимаю так: при подключении клиента к сервлету, он должен сохранять у себя SID и передавать его в хедерере при новом подключении. Верно? jsessioid либо в куках, либо параметром запроса. mr.Jack2. Обрабатываться информация должна в новом созданном потоке. Для оптимизации производительности используется пул потоков. (Это уже реализовано в контейнере сервлетов) mr.JackМогу же я из сервлета создать несоклько потоков? Если осторожно, то можете. Но могут некоторые JEE методы перестать работать, которые привязывают данные к потоку. Или например CDI. mr.JackА завершать их по заданному значению таймера допустим, что бы если клиент потерян (отключился по неизвестным причинам) ресурсы не использовались зря. Или, сервлет сам высвободит дочерние ресурсы по таймауту (session timeout)? Думаю, можно попробовать настроить таймаут сессии, и подчищать там. Но, в целом. Какое-то хлипкое решение. Может вам с JMS познакомиться? mr.Jack3. Данные, думаю, возвращать лучше в виде xml Лучше чем что? mr.Jackа клиент должен будет парсить новый xml при опросе сервлета и обновлять свои результаты. Не изобретаю ли я велосипед тут? Лучше сделать так чтобы не сильно зависеть от протокола. И чтобы его было проще подменить. Не понятно кто у вас клиенты? Java, или другие платформы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 10:39:59 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
В принципе ничего криминального То как хранить сессию зависит от нагрузки. Если у вас известно количество подключений и не бывает посторонних воздействий, типа ДДоСа например, то можете просто наивно создавать потоки и класть их в HashMap по коду сессии. Если это открытый веб, то, противоположная схема - хранить сессии в БД, создать пул тредов, которые будут периодически дергать состояние невыполненных сессий и делать по ним работу, обновляя бд, а сервлет будет дергать ту же бд для извлечения текущего статуса, т.е. сервлет->создание_сессии_в_бд тред->работа_с_сессией_в_бд сервлет->чтение_сессии_из_бд ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 12:32:57 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
у него весь вопрос строится не предположении - сервлет ДОЛГО готовит, значит нужно ГОТОВИТЬ ЧАСТЯМИ. Т.е. сохранять состояние. Это неверно или необоснованно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 12:39:18 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
* забегая вперед: клиенты - другие платформы, не Java Petro123 , Petro123автор3. Время обработки сервлетом данных может варьироваться. Клиенты должны иметь возможность опрашивать сервлет, получая часть готовых данных. Ну, по аналогии с ajax технологией. Т.е. данные у клиентов должны отображаться по мере их готовности на сервлете.нет. Нужно стремиться сделать время ответа сервлета - 0.0001 сек. Тогда твой вопрос сам собой отпадёт. Проблема в том, что время работы сервлета зависит не от него самого. Сервлет должен обращаться к некоторым сторонним приложениям, он, своего рода мост между клиентом и другими приложениями. По этому, пока сервлет не соберет данные с приложений - полный отчет для клиентов не будет доступен. Что бы хоть как то ускорить отображение данных я подумал про описанный в первом посте сценарий. Кроме того, отчет для этого клиента должен быть получен только им самим, доступ других клиентов к чужому отчету нужно ограничить. Вот именно в этом ключе мне необходимо решение. Blazkowicz , Blazkowiczmr.Jack 1. Из прочтения документации JEE по сервлетам я понял, что каждый раз, при подключении НОВОГО клиента, создается новый экземпляр сервлета.Это не так. Приведите цитату из документации по которой вы это поняли. вот эта: [quote Creating and Initializing a Servlet ]The web container initializes a servlet after loading and instantiating the servlet class and before delivering requests from clients.[/quote] перевод : веб контейнер инициализирует сервлет после загрузки и создания экземпляра класса сервлета и после доставки запроса от клиента. Т.е., получается, после каждого запроса.. да, я что то не так понял похоже. А как правильно? Где почитать/посмотреть можно? Blazkowiczmr.Jack2. Обрабатываться информация должна в новом созданном потоке.Для оптимизации производительности используется пул потоков. (Это уже реализовано в контейнере сервлетов) Можете отсюда подробнее? Пока нашел вот это, http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/org/apache/tomcat/util/threads/ThreadPool.html , ищу более подробные описания, примеры, так как, повторюсь, пока сложно мыслить "в среде". Blazkowiczmr.JackА завершать их по заданному значению таймера допустим, что бы если клиент потерян (отключился по неизвестным причинам) ресурсы не использовались зря. Или, сервлет сам высвободит дочерние ресурсы по таймауту (session timeout)?Думаю, можно попробовать настроить таймаут сессии, и подчищать там. Но, в целом. Какое-то хлипкое решение. Может вам с JMS познакомиться? Из того, что я понял из беглово ознакомления с JMS, Вы имеете ввиду модель "от пункта к пункту". Применительно к моей задаче, можно реализовать так: сервер периодически посылает сообщения клиенту и получает отклик. Если ответа нет - то клиент потерян. Верно? Существуют 2 проблемы: 1. В качестве контейнера сервлетов используется tomcat. Для него нужно накручивать сторонние разработки, вот это например http://tomee.apache.org/tomcat-jms.html . Это хорошая идея? 2. Как я понял, использование JMS возможно, если обе стороны имеют Java в качестве платформы. В моем случае это не так, платформа будет совершенно другой. Blazkowiczmr.Jack3. Данные, думаю, возвращать лучше в виде xmlЛучше чем что? Была мысль про JSON, почему то я ее откинул. Наверно JSON даже удобнее. Но, Вы видимо спросили не просто из любопытства, вероятно есть что то о чем я пока не догадываюсь и Вы можете поделиться? Blazkowiczmr.Jackа клиент должен будет парсить новый xml при опросе сервлета и обновлять свои результаты. Не изобретаю ли я велосипед тут?Лучше сделать так чтобы не сильно зависеть от протокола. И чтобы его было проще подменить. Не понятно кто у вас клиенты? Java, или другие платформы? Клиенты - другие платформы. Про зависимость от протовола - согласен, нужно сделать так, что бы зависимость была не сильной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 13:33:11 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
mr.JackПроблема в том, что время работы сервлета зависит не от него самого. Сервлет должен обращаться к некоторым сторонним приложениям, он, своего рода мост между клиентом и другими приложениями. По этому, пока сервлет не соберет данные с приложений - полный отчет для клиентов не будет доступен. Что бы хоть как то ускорить отображение данных я подумал про описанный в первом посте сценарий. Кроме того, отчет для этого клиента должен быть получен только им самим, доступ других клиентов к чужому отчету нужно ограничить. Вот именно в этом ключе мне необходимо решение. Гм, Вы имхо опять тянетесь решать проблему не с того края. Почему сервлет должен собирать данные с приложений, если заведомо известно, что данные собираются долго? Почему бы не начать работу с допиливания приложений , с тем, чтоб они отдавали данные быстро (собирать заранее и хранить данные, к примеру)? Или, если Вы не в состоянии вмешаться в работу приложений -- напишите Ваш собственный код, ВНЕ сервлетов, который будет заниматься именно сбором и складированием данных, для последующей быстрой отдачи их сервлету. А то, имхо, у Вас какое-то натягивание совы на глобус идёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 13:39:29 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
Ну и если данные заранее собирать сложно, то всё равно промежуточный модуль проблемы решает: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 13:52:30 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
mr.JackПроблема в том, что время работы сервлета зависит не от него самого. Сервлет должен обращаться к некоторым сторонним приложениям, он, своего рода мост между клиентом и другими приложениями. По этому, пока сервлет не соберет данные с приложений - полный отчет для клиентов не будет доступен. Что бы хоть как то ускорить отображение данных я подумал про описанный в первом посте сценарий. Кроме того, отчет для этого клиента должен быть получен только им самим, доступ других клиентов к чужому отчету нужно ограничить. Вот именно в этом ключе мне необходимо решение. Компанент получает от клиента задачу. (Вопрос а нахера нам тут именно сервлет вообще оставим открытым). Он раскладывает эту задачу на подзадачи и складывает в очереди (JMS/MQ). Обработчики, забирают сообщения из очереди и отправляют 3м-сторонам. (Это всегда синхронно, или с вариантами?) Полученые от 3х сторон результаты складываются в базу. Через очередь идёт нотификация "центральному обработчику результатов". Обрабочик результатов на каждое сообщение проверяет, готов ли результат целиком. Если готов, то оправляет его клиенту. Для начала вам стоит изобразить эту схему на квадратиках и затем для каждой стрелочки и каждого блока подбирать конкретное решение, потому что их масса: - Получение запроса. Сокет vs HTTP. Скорее всего лучше HTTP, сокет нужен только для достижения большой производительности. - Протокол. Если нагрузка огромная, то лучше бинарные кроссплатформеные - hessian, protobuf. Если пофиг, то XML, но не просто XML а SOAP Web Service. С другой стороны и RESTful с JSON модно и современно. - SOAP Web Service как проще всего реализовать? Правильно! JAX-WS (но есть и варианты Spring-WS, CXF) - RESTful - Spring MVC или JAX-RS. - Очередь... тут вообще масса вариантов. Apache MQ, вроде довольно популярная из бесплатных. - Отдельный вопрос это как организовать асинхронное общение с клиентом. Держать ли запрос через Comet, или всё же просто выдавать статус по переодическим запросам. ... и это мы ещё не подошли к тебе EJB Обязательно ли использовать Tomcat? Если вам лениво разбираться в море технологий, можно взять, например, JBoss и там половина из вышеперечисленного уже реализована, дополнительных библиотек не понадобится. mr.JackThe web container initializes a servlet after loading and instantiating the servlet class and before delivering requests from clients. перевод : веб контейнер инициализирует сервлет после загрузки и создания экземпляра класса сервлета и после доставки запроса от клиента. От "клиентов". В общем случае, экземпляр сервлета один. mr.JackТ.е., получается, после каждого запроса.. да, я что то не так понял похоже. А как правильно? Где почитать/посмотреть можно? Читать в спецификации http://www.oracle.com/technetwork/java/index-jsp-135475.html mr.JackМожете отсюда подробнее? Пока нашел вот это, http://tomcat.apache.org/tomcat-5.5-doc/catalina/docs/api/org/apache/tomcat/util/threads/ThreadPool.html , ищу более подробные описания, примеры, так как, повторюсь, пока сложно мыслить "в среде". Просто поверьте наслово, все серверы работают с пулами потоков. Кроме совершенно экзотических. mr.JackИз того, что я понял из беглово ознакомления с JMS, Вы имеете ввиду модель "от пункта к пункту". Применительно к моей задаче, можно реализовать так: сервер периодически посылает сообщения клиенту и получает отклик. Если ответа нет - то клиент потерян. Верно? Вам нужно асинхронно послать задачи в третьи системы, получить ответ и асинхронно отдать ответ клиенту. Ассинхронность реализуется через очереди (Message Queue). В JEE спецификация называется JMS. Но можно использовать и другой API. mr.Jack1. В качестве контейнера сервлетов используется tomcat. Для него нужно накручивать сторонние разработки, вот это например http://tomee.apache.org/tomcat-jms.html . Это хорошая идея? Если вы хотите использовать JEE стэк (JMS, JAX-WS), то лучше взять полноценный сервер. Если томкат - обязаловка, то да. Надо прикручивать готовые решения самостоятельно. mr.Jack2. Как я понял, использование JMS возможно, если обе стороны имеют Java в качестве платформы. В моем случае это не так, платформа будет совершенно другой. JMS вам нужен для асинхронных операций внутри сервера. Комуникация с клиентом это отдельная тема. mr.JackБыла мысль про JSON, почему то я ее откинул. Наверно JSON даже удобнее. Но, Вы видимо спросили не просто из любопытства, вероятно есть что то о чем я пока не догадываюсь и Вы можете поделиться? Бинарные протоколы быстрее. Текстовые протоколы имеют более широкое распространение (браузеры, мобильные девайсы) Смогут ли ваши не Java клиенты работать с вашим JSON мы не знаем. А смогут ли они это делать асинхронно? А если смогут, то как, через висящий запрос или обратный адрес? mr.JackКлиенты - другие платформы. Про зависимость от протовола - согласен, нужно сделать так, что бы зависимость была не сильной. Какие другие платформы? Вообще любые? Или какая-то конкретная? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 13:59:46 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
mr.Jack, у вас вопрос, в первую очередь, по архитектуре. И цена неверного решения - высока. Поэтому описывайте всё ТЗ. На всех уровнях. Вам же будет лучше )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 14:43:40 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
Blazkowicz , спасибо за кучу информации, она мне пригодится для дальнейшего изучения. Масштабы данного приложения не столь велики, что бы реализовывать его на столь большом стеке технологий. Да и времени на изучение и правильное построение архитекруты уйдет масса, что в рамках данного приложения не оправдано. А правильная реализация архитектура, как верно заметил Petro123 , не последний по важности вопрос. Давайте зайдем с другой стороны. И Вы и The_ShadoW в той или иной мере говорили о "а нахрена нам тут вообще сервлет" и о "модуле сбора". Что тут имеется ввиду? У меня была мысль реализовать все это не в качестве веб-приложения, а как простое jse приложение, использующее многопоточность и сокеты. Там то можно реализовать необходимое используя меньше трудозатрат и времени. Вы про это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 15:23:51 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
mr.Jack Blazkowicz , спасибо за кучу информации, она мне пригодится для дальнейшего изучения. Масштабы данного приложения не столь велики, что бы реализовывать его на столь большом стеке технологий. Да и времени на изучение и правильное построение архитекруты уйдет масса, что в рамках данного приложения не оправдано. А правильная реализация архитектура, как верно заметил Petro123 , не последний по важности вопрос. Давайте зайдем с другой стороны. И Вы и The_ShadoW в той или иной мере говорили о "а нахрена нам тут вообще сервлет" и о "модуле сбора". Что тут имеется ввиду? У меня была мысль реализовать все это не в качестве веб-приложения, а как простое jse приложение, использующее многопоточность и сокеты. Там то можно реализовать необходимое используя меньше трудозатрат и времени. Вы про это? Да, j2se-приложение может например складывать данные в базу, а вы напишите простенькое веб-приложение, которое будет тоже работать с этой базой и предоставлять http-инерфейс извне ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 16:32:16 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
Да мне собственно и бд то не нужна. Приложение должно работать только как мост, не более. Долговременное хранение не нужно, только на время активной сессии с клиентом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 17:11:37 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
mr.JackДа мне собственно и бд то не нужна. Приложение должно работать только как мост, не более. Долговременное хранение не нужно, только на время активной сессии с клиентом Приложение о чём? Какое? Счас будет N страниц про коня в вакууме. Начинают проектирование ИС с поиска аналогов и классификации (Концепция). Там слов мост \ сервлет вообще нету. Потом преценденты \ ВИ - потом архитектура. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 17:23:09 |
|
||
|
Сервлет. Связь 'один-ко-многим'
|
|||
|---|---|---|---|
|
#18+
mr.JackДа мне собственно и бд то не нужна. Приложение должно работать только как мост, не более. Долговременное хранение не нужно, только на время активной сессии с клиентом Асинхронность нужна? Нет? Может тогда ExecutorService просто взять? Пулять туда таски и ждать. Когда все нужные Future выполнены, возвращать данные., ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2012, 17:24:25 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37975535&tid=2130883]: |
0ms |
get settings: |
14ms |
get forum list: |
26ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
70ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 284ms |
| total: | 506ms |

| 0 / 0 |
