Как использовать модули в Google App Engine и добавить к ним цель с помощью очереди задач (Java)?
У меня есть задача, срок выполнения которой превышает 10 минут. Просматривая различные документы, я обнаружил, что используя модули, я могу запустить экземпляр, который будет обрабатывать долгосрочную задачу, но предпочтительно даже это должно быть сделано с использованием очереди задач. Я использовал бэкэнды, но они устарели.
У меня вопрос: как я могу ввести модули в существующий проект App Engine и как их использовать для выполнения долгосрочных задач?
Ниже приведен фрагмент кода:
Queue queue = QueueFactory.getQueue("myqueue");
TaskOptions task = TaskOptions.Builder.withUrl("/submitworker").method(Method.POST);
queue.add(task);
Какие изменения я должен сделать в приведенном выше коде, чтобы добавить долгосрочную задачу с помощью модуля? ["Submitworker" - это сервлет, который является актуальной долгосрочной задачей]
Я ссылался на эту ссылку, но не могу обойтись третьим шагом:
3. Добавьте элементы объявления службы в файл appengine-application.xml.
Кроме того, даже если я успешно добавлю модуль в свой проект, как я могу нацелить этот модуль с помощью очереди задач?
Я прошел через этот вопрос, но это реализация на python, моя реализация на Java.
Я ищу пошаговый процесс о том, как использовать "Target" в модулях и как использовать его при добавлении в очередь задач.
Даже если я добавлю долгосрочную цель модуля в очередь задач, все равно будет ли она прервана через 10 минут или она завершит задачу, даже если срок задачи в очереди задач истек?
Пожалуйста, предложите.
2 ответа
Модули и сервисы - это одно и то же, они похожи на старые бэкэнды (которые все еще работают, но не рекомендуются).
Есть два основных способа заставить модули работать:
- Создайте EAR и разверните его
- Развертывайте сервисы независимо как файлы WAR (что, вероятно, вы делаете сейчас с модулем по умолчанию)
Второй вариант, вероятно, проще, потому что это всего лишь вопрос изменения вашего application-web.xml. У вас может быть репо или ветка на модуль, или просто процесс сборки, который изменяет модуль, на который вы ориентируетесь.
Прямо сейчас ваше application-web.xml, вероятно, имеет что-то вроде этого:
<application>@appId@</application>
<version>@appVersion@</version>
<module>default</module>
изменить это на что-то вроде этого
<application>@appId@</application>
<version>@appVersion@</version>
<module>long-running-service</module>
<instance-class>B1</instance-class>
<manual-scaling>
<instances>1</instances>
</manual-scaling>
Вы настраиваете саму очередь, чтобы предназначаться для определенного модуля в queue.xml
Смотрите здесь.
Отказ от ответственности: ответ основан исключительно на документации (на самом деле я использую Python - те же понятия, но разные конфигурации).
Чтобы сервис / модуль позволял выполнять длительные задачи, вы должны настроить его для базового или ручного масштабирования. Из типов масштабирования и классов экземпляров (Deadline
строка в таблице):
- в
Manual scaling
колонка:
Запросы могут выполняться бесконечно. Масштабируемый вручную экземпляр может обрабатывать /_ah/ запускать и выполнять программу или сценарий в течение многих часов без возврата кода ответа HTTP. Задачи могут работать до 24 часов.
- в
Basic scaling
колонка:
То же, что и ручное масштабирование.
Конфигурации масштабирования модуля, выполняемые через соответствующие модули appengine-web.xml
файл, описанный в элементах Scaling:
<manual-scaling>
:
Необязательный. Элемент включает масштабирование вручную для модуля и устанавливает количество экземпляров для модуля.
<basic-scaling>
:
Необязательный. Элемент устанавливает количество экземпляров для модуля.
Что касается фактического преобразования в модули, дополните руководство, на которое вы указали, файлами конфигурации (включая пример) и appengine-web.xml
Синтаксис (см. module
а также service
конфиги).
Около appengine-application.xml
из файлов конфигурации:
Каталог META-INF содержит два файла конфигурации:
appengine-application.xml
а такжеapplication.xml
,appengine-application.xml
файл содержит общую информацию, используемую инструментами App Engine при развертывании вашего приложения...
...
Обратите внимание, что в то время как каждый
appengine-web.xml
файл должен содержать<application>
тег, имя, которое вы указываете там, игнорируется. Название заявки взято из<application>
тег вappengine-application.xml
файл.
Чтобы направить определенную очередь в определенный сервис / модуль, вы используете queue.xml
файл. Из синтаксиса:
<target>
(push очереди):
Необязательный. Строка с именем модуля / версии, версии внешнего интерфейса или серверной части, для которой выполняются все задачи, поставленные в очередь в этой очереди.
Строка добавляется к имени домена вашего приложения при создании HTTP-запроса для задачи. Например, если ваш идентификатор приложения - my-app, а вы установили целевой объект my-version.my-service, в качестве имени хоста URL будет указано my-version.my-service.my-app.appspot.com.
Если цель не указана, то задачи вызываются в той же версии приложения, в которой они были поставлены в очередь. Таким образом, если вы поставили задачу в очередь из версии приложения по умолчанию, не указав цель в очереди, задача вызывается в версии приложения по умолчанию. Обратите внимание, что если версия приложения по умолчанию изменяется между временем постановки задачи в очередь и временем ее выполнения, то задача будет выполняться в новой версии по умолчанию.
Если вы используете модули вместе с файлом отправки, HTTP-запрос вашей задачи может быть перехвачен и перенаправлен на другой модуль.