Обмен данными в режиме реального времени через AJAX с несколькими потоками - PullRequest
6 голосов
/ 15 июня 2011

Я занимаюсь разработкой приложения в JSF 2.0 и хотел бы иметь многострочное текстовое поле, которое отображает выходные данные, которые считываются (строка за строкой) из файла в режиме реального времени.

Таким образом, цель состоит в том, чтобычтобы у меня была страница с кнопкой, которая запускает бэкэнд, чтобы начать чтение из файла, а затем отображать результаты в процессе чтения в текстовом поле.


Я думал сделать это следующим образом:

Локальная страница должна отслеживать, какие строки она извлекла / отобразила в текстовом поле.

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

Это будет продолжаться до тех пор, пока весь файл не будет полностью извлечен.


Проблема в том, что метод bean, который читает из файла, выполняет цикл while, который блокирует.Таким образом, для чтения из структуры данных, в которую она записывает, потребуется использование дополнительных потоков, верно?Я слышал, что создание новых потоков в веб-приложении - это потенциально опасный шаг, и что следует использовать пулы потоков и т. Д.

Может кто-нибудь пролить свет на это?


Обновление: Я попробовал пару разных вещей без удачи.Но мне удалось заставить его работать, породив отдельный Thread для запуска моего цикла блокировки, в то время как основной поток мог использоваться для чтения из него всякий раз, когда обрабатывается запрос AJAX.Есть ли хорошая библиотека, которую я мог бы использовать, чтобы сделать что-то похожее на это, которая все еще дает JSF некоторый контроль жизненного цикла над этим Thread?

1 Ответ

1 голос
/ 17 июня 2011

Рассматривали ли вы реализацию интерфейса Future (включен в Java5 + Concurrency API)?По сути, когда вы читаете файл, вы можете разбить его на разделы и просто создать новый объект Future (для каждого раздела).Затем вы можете вернуть объект после завершения вычислений.

Таким образом, вы предотвращаете необходимость доступа к структуре, пока она еще обрабатывается циклом, и вы также разбиваете операции на более мелкие вычисления, сокращая время блокировки (общее время блокировки может быть больше, но вы получитеболее быстрый ответ на другие вопросы).Если вы поддерживаете порядок, в котором были созданы ваши объекты Future, вам не нужно отслеживать строки #.Обратите внимание, что вызов Future.get () блокируется до тех пор, пока объект не будет «готов».

В остальном ваш подход был бы аналогичным - вызов Ajax для получения содержимого всех «готовых» объектов Future из очереди FIFO.

Мне кажется, я понимаю, что выпытаясь достичь .. может быть, немного больше информации поможет.

...