powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервлет. Связь 'один-ко-многим'
15 сообщений из 15, страница 1 из 1
Сервлет. Связь 'один-ко-многим'
    #37975202
mr.Jack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть такая модель:
1. Есть сервлет. Он должен принимать соединения от клиентов, как то идентифицируя их
2. Клиенты посылают данные на сервлет, он их обрабатывает и возвращает ответ, формат которого пока не ясен
3. Время обработки сервлетом данных может варьироваться. Клиенты должны иметь возможность опрашивать сервлет, получая часть готовых данных. Ну, по аналогии с ajax технологией. Т.е. данные у клиентов должны отображаться по мере их готовности на сервлете.

Я пока только вникаю в технологию, т.е. сами понимаете, опыта нет, пока сложно мыслить "в среде" так сказать.

1. Из прочтения документации JEE по сервлетам я понял, что каждый раз, при подключении НОВОГО клиента, создается новый экземпляр сервлета. Базовая идентификация уже есть, на основе sessin id . Т.е. я понимаю так: при подключении клиента к сервлету, он должен сохранять у себя SID и передавать его в хедерере при новом подключении. Верно?
2. Обрабатываться информация должна в новом созданном потоке. Могу же я из сервлета создать несоклько потоков? А завершать их по заданному значению таймера допустим, что бы если клиент потерян (отключился по неизвестным причинам) ресурсы не использовались зря. Или, сервлет сам высвободит дочерние ресурсы по таймауту (session timeout)?
3. Данные, думаю, возвращать лучше в виде xml, а клиент должен будет парсить новый xml при опросе сервлета и обновлять свои результаты. Не изобретаю ли я велосипед тут?
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37975535
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr.Jack,
ты всё усложняешь.
Сервлет - это кусок кода - процедура на Java которая может вызываться из потока (не ты решаешь).
А принцип Веба - "спросил и забыл" Т.е. НЕ идентифицировать клиента.

Из этого и исходи - докажи что тебе нужна идентификация по БЛ.

автор3. Время обработки сервлетом данных может варьироваться. Клиенты должны иметь возможность опрашивать сервлет, получая часть готовых данных. Ну, по аналогии с ajax технологией. Т.е. данные у клиентов должны отображаться по мере их готовности на сервлете.
нет.
Нужно стремиться сделать время ответа сервлета - 0.0001 сек.
Тогда твой вопрос сам собой отпадёт.
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37975559
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, или другие платформы?
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37975777
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе ничего криминального

То как хранить сессию зависит от нагрузки.
Если у вас известно количество подключений и не бывает посторонних воздействий, типа ДДоСа например, то можете просто наивно создавать потоки и класть их в HashMap по коду сессии.
Если это открытый веб, то, противоположная схема - хранить сессии в БД, создать пул тредов, которые будут периодически дергать состояние невыполненных сессий и делать по ним работу, обновляя бд, а сервлет будет дергать ту же бд для извлечения текущего статуса, т.е.
сервлет->создание_сессии_в_бд
тред->работа_с_сессией_в_бд
сервлет->чтение_сессии_из_бд
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37975793
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у него весь вопрос строится не предположении - сервлет ДОЛГО готовит, значит нужно ГОТОВИТЬ ЧАСТЯМИ.
Т.е. сохранять состояние.
Это неверно или необоснованно.
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37975901
mr.Jack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
* забегая вперед: клиенты - другие платформы, не 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, или другие платформы?
Клиенты - другие платформы. Про зависимость от протовола - согласен, нужно сделать так, что бы зависимость была не сильной.
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37975918
The_ShadoW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr.JackПроблема в том, что время работы сервлета зависит не от него самого. Сервлет должен обращаться к некоторым сторонним приложениям, он, своего рода мост между клиентом и другими приложениями. По этому, пока сервлет не соберет данные с приложений - полный отчет для клиентов не будет доступен. Что бы хоть как то ускорить отображение данных я подумал про описанный в первом посте сценарий. Кроме того, отчет для этого клиента должен быть получен только им самим, доступ других клиентов к чужому отчету нужно ограничить. Вот именно в этом ключе мне необходимо решение.
Гм, Вы имхо опять тянетесь решать проблему не с того края.
Почему сервлет должен собирать данные с приложений, если заведомо известно, что данные собираются долго? Почему бы не начать работу с допиливания приложений , с тем, чтоб они отдавали данные быстро (собирать заранее и хранить данные, к примеру)?

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

А то, имхо, у Вас какое-то натягивание совы на глобус идёт.
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37975949
The_ShadoW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и если данные заранее собирать сложно, то всё равно промежуточный модуль проблемы решает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
+---------+                                       +---------------------+
|         | ------------ хочу данные! ----------> |                     | ---- приложения, ну-ка гоните данные! ---->
|         | <---- погоди, собираю твои данные --- |                     |
| Сервлет |             -- либо --                |     Модуль сбора    |     +--------------------------------------
|         | <------ собрал, на твои данные ------ |                     | <---+------- получай свои данные... -------
|         |                                       |                     |     +--------------------------------------
+---------+                                       +---------------------+
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37975965
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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Клиенты - другие платформы. Про зависимость от протовола - согласен, нужно сделать так, что бы зависимость была не сильной.
Какие другие платформы? Вообще любые? Или какая-то конкретная?
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37976042
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr.Jack,
у вас вопрос, в первую очередь, по архитектуре.
И цена неверного решения - высока.
Поэтому описывайте всё ТЗ. На всех уровнях.
Вам же будет лучше ))))
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37976114
mr.Jack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz , спасибо за кучу информации, она мне пригодится для дальнейшего изучения.
Масштабы данного приложения не столь велики, что бы реализовывать его на столь большом стеке технологий. Да и времени на изучение и правильное построение архитекруты уйдет масса, что в рамках данного приложения не оправдано. А правильная реализация архитектура, как верно заметил Petro123 , не последний по важности вопрос.

Давайте зайдем с другой стороны. И Вы и The_ShadoW в той или иной мере говорили о "а нахрена нам тут вообще сервлет" и о "модуле сбора". Что тут имеется ввиду? У меня была мысль реализовать все это не в качестве веб-приложения, а как простое jse приложение, использующее многопоточность и сокеты. Там то можно реализовать необходимое используя меньше трудозатрат и времени. Вы про это?
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37976245
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr.Jack Blazkowicz , спасибо за кучу информации, она мне пригодится для дальнейшего изучения.
Масштабы данного приложения не столь велики, что бы реализовывать его на столь большом стеке технологий. Да и времени на изучение и правильное построение архитекруты уйдет масса, что в рамках данного приложения не оправдано. А правильная реализация архитектура, как верно заметил Petro123 , не последний по важности вопрос.

Давайте зайдем с другой стороны. И Вы и The_ShadoW в той или иной мере говорили о "а нахрена нам тут вообще сервлет" и о "модуле сбора". Что тут имеется ввиду? У меня была мысль реализовать все это не в качестве веб-приложения, а как простое jse приложение, использующее многопоточность и сокеты. Там то можно реализовать необходимое используя меньше трудозатрат и времени. Вы про это?

Да, j2se-приложение может например складывать данные в базу, а вы напишите простенькое веб-приложение, которое будет тоже работать с этой базой и предоставлять http-инерфейс извне
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37976291
mr.Jack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да мне собственно и бд то не нужна. Приложение должно работать только как мост, не более. Долговременное хранение не нужно, только на время активной сессии с клиентом
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37976308
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr.JackДа мне собственно и бд то не нужна. Приложение должно работать только как мост, не более. Долговременное хранение не нужно, только на время активной сессии с клиентом
Приложение о чём? Какое?
Счас будет N страниц про коня в вакууме.
Начинают проектирование ИС с поиска аналогов и классификации (Концепция).
Там слов мост \ сервлет вообще нету.
Потом преценденты \ ВИ - потом архитектура.
...
Рейтинг: 0 / 0
Сервлет. Связь 'один-ко-многим'
    #37976311
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mr.JackДа мне собственно и бд то не нужна. Приложение должно работать только как мост, не более. Долговременное хранение не нужно, только на время активной сессии с клиентом
Асинхронность нужна? Нет? Может тогда ExecutorService просто взять? Пулять туда таски и ждать. Когда все нужные Future выполнены, возвращать данные.,
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Сервлет. Связь 'один-ко-многим'
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]