2013-05-04 3 views
1

В моем приложении мне нужно обработать загруженные документы и поместить результаты обработки в БД.
Документы хранятся в файловой системе, а метаданные хранятся в БД.
Для каждого документа необходимо открыть и обработать файл с диска, а не обновлять метаданные в БД соответственно. Обработка может быть дорогостоящей и длиться долго.
То, что я планирую сделать это:Каков правильный способ запуска фоновой задачи в Play 2.1 (Java)?

  1. Span N задач, одна задача для обработки одного документа
  2. Каждая задача будет пойти и найти самый старый, «необработанный» документ
  3. Задача будет маркировать его как «в прогресс»в БД и начать ее обработку
  4. после обработки задачи документа будет обновлять метаданные и отметьте его в БД, как„обработаны“
  5. Задача будет перейти к шагу 2, после чего

Какое право/самый простой способ реализовать это использование Play и Akka, предполагающее применение, написано на Java, а не Scala? Также будут оценены примеры исходного кода.

ответ

1

Правильный способ: «Не запускать никаких фоновых задач в приложении для воспроизведения». Play - это веб-среда для написания веб-приложений, а фоновая задача по определению не использует веб-интерфейс. Поэтому настройте отдельную бегущую задачу и отправьте ей сообщения/события через Akka. На самом деле, у вас будет гораздо более масштабируемое приложение, если вы будете использовать как можно больше бизнес-логики в фоновых задачах.

Для примера этой модели доведенный до логического конца, посмотрите на веб-сервере Mongrel2 http://mongrel2.org/manual/book-final.html

Учитывая, что у нас есть такие инструменты, как Акку и Верблюд в JVM мире, и что рамки как проигрываться отъема нас с архитектурой сервлета, я думаю, что пришло время следовать примеру Mongrel2 и вернуться к более трехуровневой архитектуре, где уровень веб-приложений обеспечивает минимальную работу.

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

+0

Майкл, вы, очевидно, правы, но это всего лишь прототип приложения, он будет работать на одном экземпляре JVM. Я понял, что Play использует Akka, и что запросы на обслуживание и мои собственные задачи - все это просто задачи, выполняемые разными актерами с точки зрения Акки. Поэтому я даже думал, что «в Play приложения» на самом деле это «в Акке»? –

+0

Справа. Используйте библиотеки Akka. Сена. Попросите актеров запустить фоновое задание. Но ради чистого дизайна предположим, что актеры не будут на одной машине. На самом деле, почему бы не запустить вторую JVM для фоновых задач. Это поможет вам создать чистый дизайн, который может потенциально масштабировать до 1000 машин. –

Смежные вопросы