2012-06-19 5 views
5

Каков наилучший способ реализовать какой-либо индикатор прогресса в Play?Индикатор прогресса в области воспроизведения

У меня есть простая страница импорта, где пользователь может загрузить файл csv. Затем сервер выполняет некоторую обработку длины до тех пор, пока импорт не будет завершен. Я хотел бы перенаправить пользователя на отдельную страницу после загрузки и дать ему некоторую постоянную обратную связь на этой странице «150 из 856 наборов данных, импортированных».

Действие загрузки запускает метод контроллера, который может запустить трудоемкую задачу в своем потоке, но как мне получить статус задания с помощью ajax-вызова с другой страницы (поскольку в игре нет каких-либо состояние между запросами)?

ответ

3

Что вы, скорее всего, будете делать, это создать задание с вашего контроллера. На самом деле, если вы читаете документацию Play, вам настоятельно рекомендуется выполнять длительную обработку в Джобсах, чтобы они не зависали потоками HTTP-запросов.

Итак, ваша работа выполняется, обрабатывая файл CSV. Следующим шагом будет запись, когда каждый набор данных был обработан. Итак, предположим, что вы передаете свое задание ссылку, например, uid или какой-то уникальный номер, который вы передаете своему клиенту. Затем вам просто нужно записать (возможно, в базу данных, если вы хотите легко соответствовать безгражданству и масштабировать) каждый прирост вашего количества наборов данных, обработанных против вашего уникального идентификатора.

, например

@Entity 
public class DatasetProgress extends Model { 

    public Long uid; 
    public Long datasetsDone; 
    public Long datasetsTotal; 

} 

Вы можете создать действие контроллера, который возвращает объект DatasetProgress на основе вашего UID, который вы можете использовать, чтобы показать прогресс бар.

1

Одна вещь, которую вы могли бы сделать, - это иметь централизованное уведомление. Вы можете указать импорт уникального идентификатора и написать сообщения об обновлениях с этим идентификатором. Затем, чтобы получить статус, вы просто используете этот ключ.

Другой вариант - использовать веб-сокеты и в основном отсылать уведомления клиенту (хотя они еще не получили широкого распространения).

+1

Я бы воспользовался обоими ответами John's и @Codemwnci для выполнения этой задачи, особенно если вы уверены, что будете использовать браузеры, поддерживающие WebSockets или, по крайней мере, Comet. В этом случае вы можете создать действительно живой индикатор выполнения. – biesior