С очередями задач пользователь может инициировать запрос , чтобы иметь приложения выполняют работу за пределы из этого запроса; они являются мощным инструментом для фоновой работы.
Кроме того, вы можете о rganize работы в малые, дискретные единицы ( задачи ). Затем приложение вставляет эти задачи в одну или несколько очередей на основе конфигурации очереди и обрабатывает их в порядке FIFO. Вот диаграмма, которую я взял из презентации Google IO, которая иллюстрирует вставку задачи высокого уровня в очередь:
Конфигурация очереди
1. Push- очереди (по умолчанию):
Задачи
Они представляют собой единицу работы, выполняемой приложением. T
спрашивает являются
идемпотентно, то есть они являются уникальными в очереди и согласно документации Google не могут быть вызваны более одного раза одновременно (если какое — то странное внутреннее состояние ошибки не бывает).
Я nstances из TaskOptions класса, задачи состоят из URL и полезной нагрузки , которая может быть простой строкой, двоичный объект (байт []), или экземпляр DeferredTask. DeferredTask в основном Runnable. Это позволяет вам связывать задачи вместе. Наша команда должна была сделать это, чтобы смоделировать задачи длительного выполнения, когда максимальный лимит исполнения GAE составлял 30 секунд. В настоящее время задача
должен завершить выполнение и отправить значение ответа HTTP между 200–299 в течение 10 минут после исходного запроса. Этот крайний срок отделен от пользовательских запросов, которые имеют 60-секундный крайний срок.
просит использовать маркеры для контроля скорости выполнения задач. Каждый раз , когда
задача я
nvoked, используется маркер. Эта лизинговая модель (получение токена) обычно относится к
брокерским системам или системам передачи сообщений и позволяет пользователям контролировать скорость
выполнения этих задач
(см. Ниже о настройке очередей).
Наконец, очень важной особенностью API очереди задач является то, что он имеет автоматические повторные попытки задач. Вы можете настроить это с параметром RetriesOptions при создании объекта TaskOptions .
Задача в транзакции
Задачи могут быть поставлены в
очередь как часть транзакции хранилища данных. Вставка (не выполнение) будет
гарантирована, если
транзакция была успешно завершена. Единственное предостережение в том, что
транзакционные задачи не могут иметь пользовательских имен, и
в одной транзакции
может быть не более 5 вставок в очереди задач. Конфигурация Очередь сконфигурирована с помощью queue.xml. Если опущено, используется очередь по умолчанию с конфигурацией по умолчанию. Поскольку очереди извлечения предназначены для более сложных задач, они должны быть специально настроены (нет очереди извлечения по умолчанию).
Конфигурация очереди приложения применяется ко всем версиям приложения. Вы можете переопределить это поведение для push-очередей, используя целевой параметр в queue.xml. Это используется, если вам нужны разные версии вашего приложения (разные сайты) с разной конфигурацией обработки очереди.
Вот некоторые вещи, которые вам разрешено настраивать (более обширная документация):
скорость высока (только толчок). (Предупреждение: сервер разработки игнорирует это значение)
данный
момент в указанной очереди (только нажатие).
d = дни). Если 0, очередь считается приостановленной. (Предупреждение: сервер разработки игнорирует это
значение)
<queue-entries> <!--Set the number of max concurrent requests to 10--> <queue> <name>optimize-queue</name> <rate>20/s</rate> <bucket-size>40</bucket-size> <max-concurrent-requests>10</max-concurrent-requests> </queue> </queue-entries>
Пример кода
Это очень простой пример. Как я уже говорил, очереди задач в основном являются обработчиками URL. В этом сервлете GET будет обрабатывать поставленную задачу. Задача отправит POST к этому же сервлету и выполнит метод doPost (), выполняющий задачу. В данном случае это просто простой счетчик. Обратите внимание, что счетчик является изменчивым свойством. Если вы получите доступ к этому сервлету как запрос GET, он поставит в очередь другую задачу. Таким образом, вы увидите, что счетчик увеличивается с помощью обеих задач.
public class TaskQInfo extends HttpServlet { private static volatile int TASK_COUNTER = 0; // Executed by user menu click public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { // Build a task using the TaskOptions Builder pattern from ** above Queue queue = QueueFactory.getDefaultQueue(); queue.add(withUrl("/taskq_demo").method(TaskOptions.Method.POST)); resp.getWriter().println( "Task have been added to default queue... "); resp.getWriter().println( "Refresh this page to add another count task"); } // Executed by TaskQueue @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // This is the body of the task for(int i = 0; i < 1000; i++) { log.info("Processing: " + req.getHeader("X-AppEngine-TaskName") + "-" + TASK_COUNTER++); try { // Sleep for a second (if the rate is set to 1/s this will allow at most 1 more task to be processed) Thread.sleep(1000); } catch (InterruptedException e) { // ignore} } } }
Очереди задач позволяют вам достичь некоторого уровня параллелизма в вашем приложении, вызывая фоновые процессы по требованию. Для очень длительных задач вы можете взглянуть на бэкэнды App Engine , которые в основном являются специальными экземплярами App Engine без ограничения времени запроса.