![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Dervish24 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 23.9.2009 Репутация: нет Всего: нет |
Нужно реализовать сервис который генерит и возвращает огромный массив строк. Если сделать что-то вроде этого:
То на сколько я понимаю клиент вынужден будет ждать пока не закончится формирование всех строк и только потом получит их все махом. Как сделать так, что бы можно было бы кидать сгенерированные данные в поток не дожидаясь завершения генерации? |
|||
|
||||
| afon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 5.4.2008 Где: Украина, Киев Репутация: нет Всего: 1 |
Через обычный servlet.
Берете response.getOutputStream и бросаете в него свои данные. А они будут уходить юзеру на лету, по мере наполнения OutputStream. Когда данныеч закончатся, тогда поток закроется (то есть вы его закроете) PS: а через вебсервис (вроде как) не получится. Потому что при формировании ответа jax или jaxb или кто у вас там будет проверять формат ответа на валидность, а пока он не будет полностью закрыт, он не будет полностью форматирован, т.е будет невалидным. Такая фигня. Это сообщение отредактировал(а) afon - 10.2.2010, 13:04 |
|||
|
||||
| vogdb |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 8.1.2010 Репутация: нет Всего: нет |
С такой проблемой сталкивался. Идейно было несколько решений.
1. Сервис А, который возвращает одну строчку из этого массива, а само собирание массива происходит в Bpel через Foreach для сервиса А. Bpel соответственно будет являться искомым результатом. 2. Возвращаем сервисом нечто
где <Array> - наш собственный complex type тег, а item соответственно String. 3. Возвратить этот массив в виде одной строчки с каким-то разделителем, а потом где надо разобрать и собрать. Моим решением, как ни странно стало 3ее, т.к. существующие сервисы работали до этого с файлами и имели встроенные парсеры, потому необходимо было лишь дать им на вход массив запакованный по знакомым им правилам. На мой взгляд, хорошим решением является 2ое, но терзают смутные сомнения, что подходящим полностью под SOA принципы будет 1ое решение. В общем, жду продолжения дискуссии, а то она тут какая-то неоживленная, хотя проблема очень частая. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 4 Всего: 43 |
Принцип формирования целиком ответа и отправление его клиенту как единое целое имеет основания. Так проще контролировать процесс пересылки. Если при передаче ответа случился сбой (соединение разорвалось, например), то клиент должен выкинуть уже полученную часть данных и повторить опять запрос. Запрашивать только недополученные данные нельзя если данные динамические. По этой причине клиент не может обрабатывать или отображать данные, т.е. применять по назначению, пока они не получены полностью. Иначе "откатывать" назад будет сложно. Поэтому клиент тоже копит данные, пока не получит их все.
Если ответ большой, а сетевое соединение ненадежное, то пересылка ответа может никогда не закончиться. Поэтому при проектировании системы, работающей через интернет, желательно стремиться к тому, чтобы ответ на запрос был не большой и не маленький. Не маленький по сравнению с размером пакета tcp. И не большой настолько, чтобы у всех клиентов хватало памяти их буферизировать и чтобы свести к минимуму повторные запросы. Не надо передавать "огромный массив" совсем. Это сообщение отредактировал(а) COVD - 25.2.2010, 22:17 |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |