Обмен данными в режиме реального времени через AJAX с несколькими потоками

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

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


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

сохранить локальную страницу отслеживайте, какие строки он извлек / отобразил в текстовом поле до сих пор.

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

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


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

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


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

1 ответов


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

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

остальные из вас будут похожи-сделайте вызов Ajax, чтобы получить содержимое всех "готовых" будущих объектов из очереди FIFO.

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