Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать сервис пишущий в поток? 
:(
    Опции темы
Dervish24
  Дата 10.2.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.9.2009

Репутация: нет
Всего: нет



Нужно реализовать сервис который генерит и возвращает огромный массив строк. Если сделать что-то вроде этого:
Код

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService()
public class HelloWorld {
  @WebMethod()
  public String sayHi(final String[] text) {
...
  }
}


То на сколько я понимаю клиент вынужден будет ждать пока не закончится формирование всех строк и только потом получит их все махом. Как сделать так, что бы можно было бы кидать сгенерированные данные в поток не дожидаясь завершения генерации?
PM MAIL   Вверх
afon
Дата 10.2.2010, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.4.2008
Где: Украина, Киев

Репутация: нет
Всего: 1



Через обычный servlet.
Берете response.getOutputStream и бросаете в него свои данные. 
А они будут уходить юзеру на лету, по мере наполнения OutputStream.
Когда данныеч закончатся, тогда поток закроется (то есть вы его закроете)

PS: а через вебсервис (вроде как) не получится. Потому что при формировании ответа jax или jaxb или кто у вас там будет проверять формат ответа на валидность, а пока он не будет полностью закрыт, он не будет полностью форматирован, т.е будет невалидным. Такая фигня. 

Это сообщение отредактировал(а) afon - 10.2.2010, 13:04
PM MAIL WWW   Вверх
vogdb
Дата 25.2.2010, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.1.2010

Репутация: нет
Всего: нет



С такой проблемой сталкивался. Идейно было несколько решений.
1. Сервис А, который возвращает одну строчку из этого массива, а само собирание массива происходит в Bpel через Foreach для сервиса А. Bpel соответственно будет являться искомым результатом.
2. Возвращаем сервисом нечто
Код

<Array>
   <item>
      ....
   </item>
   ....
</Array>

где <Array> - наш собственный complex type тег, а item соответственно String.
3. Возвратить этот массив в виде одной строчки с каким-то разделителем, а потом где надо разобрать и собрать.

   Моим решением, как ни странно стало 3ее, т.к. существующие сервисы работали до этого с файлами и имели встроенные парсеры, потому необходимо было лишь дать им на вход массив запакованный по знакомым им правилам.
   На мой взгляд, хорошим решением является 2ое, но терзают смутные сомнения, что подходящим полностью под SOA принципы будет 1ое решение.
   В общем, жду продолжения дискуссии, а то она тут какая-то неоживленная, хотя проблема очень частая.
PM MAIL   Вверх
COVD
Дата 25.2.2010, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



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

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

Не надо передавать "огромный массив" совсем. 



Это сообщение отредактировал(а) COVD - 25.2.2010, 22:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.