Потоковая обработка

#scala #playframework #akka #scalaz #scalaz-stream

#scala #игровая фреймворк #akka #scalaz #scalaz-поток

Вопрос:

Есть требование, чтобы при загрузке пользователем a file он работал следующим образом

1) Пользователю отображается диалоговое окно загрузки файла (в браузере). Пользователь выбирает файл. 2) Приложение должно загружать только первое количество записей x (например, допустим, общее количество записей равно 100, затем получите первые 10), и у пользователя будет возможность выполнить визуальный просмотр записей (просмотр только для чтения). 3) Затем пользователь решает одну из двух вещей: «Нажмите «Отправить», которая будет принимать все данные и потоки на сервер, Или, если он / она нажмет «Далее», он / она может просмотреть следующие 10 записей и т. Д.

Является ли Scalaz-stream подходящим решением для всех и, в частности, для выполнения 2) и 3) сверху? Чтобы получить только частичные данные и приостановить поток, затем продолжить, использовать и повторить процесс?

Ответ №1:

Нет, scalaz-stream не очень хорошая идея. Игра! фреймворк имеет свой собственный фреймворк с Enumerator классами , Enumeratee , и Iteratee , которые могут использоваться для асинхронной обработки потоков, и код загрузки файлов уже создан для его использования.

У вас есть два варианта:

Во-первых, используйте HTML5 и интерфейсный Javascript, чтобы получить доступ к файлу. Это будет работать только в новейших браузерах. Это единственный вариант, если вы не хотите, чтобы какой-либо файл загружался, пока пользователь не выберет «Отправить».

Во-вторых, постепенно анализируйте загрузку по мере ее поступления на сервер с помощью Enumerator фреймворка и отвечайте через AJAX / Comet / Websocket с длительным опросом на интерфейсный Javascript с подмножеством записей по мере их анализа. То Iteratee , что анализирует входящую загрузку, должно будет приостановиться и ждать дальнейшего ввода от интерфейса. Это решение будет сложным и будет страдать от проблем с тайм-аутом браузера.

Ни то, ни другое не является очень хорошей идеей. Было бы намного проще загрузить весь файл сразу, затем отправить проанализированные записи обратно во внешний интерфейс, а кнопка «Отправить» фактически функционирует как кнопка «Сохранить», чтобы сообщить серверу сохранить полученную загрузку. Если вы не загружаете файлы Excel размером более 100 МБ по мобильному соединению, это, вероятно, самое простое и наиболее совместимое решение.