Если тип выполнения сервиса геообработки является асинхронным, все задачи геообработки в рамках сервиса будут поддерживать только операцию (submitJob). Операция submitJob для длительных задач, которые служат для обработки больших наборов данных. Кроме того, сервер геообработки может создать результирующий картографический сервис с целью успешного выполнения задания. Поэтому операция submitJob подходит для выходных данных инструмента, не подлежащих передаче, таких как TIN, САПР и так далее, а также для выходных растровых данных, которые не могут отображаться веб-приложениями. В подобных случаях выходные данные будут отображаться сервером как результирующий картографический сервис, а клиенты смогут добавлять результирующий картографический сервис в свои веб-приложения.
Отправка задания с помощью submitJob
Шаблон URL для операции submitJob – http://<gp-task-url>/submitJob. Клиент отправляет запрос для выполнения задачи с помощью операции submitJob. При отправке задания входные параметры задачи создаются в виде URL-адреса и отправляются на сервер аналогично операции executeTask. Когда сервер получает запрос на операцию submitJob он создает ресурс задания с уникальным идентификатором, известным как jobId, и возвращает этот идентификатор клиенту. Ответ сервера после выполнения операции submitJob для задачи геообработки будет содержать уникальный идентификатор задания (jobId) и статус задания (jobStatus), как показано ниже.
Ответ JSON на запрос submitJob
{ "jobId" : "ja892cd2a90d149db9a171fc86ff530b4",
"jobStatus": "esriJobSubmitted"}
Проверка статуса задания
URL для ресурса задания – http://<task-url>/jobs/<jobId>. Клиент может периодически отправлять запросы через URL-адрес задания и определять статус этого задания. Ответ сервера на запрос статуса задания будет включать jobId, jobStatus и сообщения инструмента геообработки в зависимости от уровня сообщений сервиса геообработки. В JSON, расположенном ниже, показан ответ, отправленный сервером на запрос статуса. Обратите внимание, что каждое сообщение имеет тип и свойство описания.
Ответ JSON на запрос статуса
{
"jobId": "ja892cd2a90d149db9a171fc86ff530b4", "jobStatus": "esriJobExecuting", "messages": [ {
"type": "esriJobMessageTypeInformative", "description": "Submitted."
}, {
"type": "esriJobMessageTypeInformative", "description": "Executing..."
}
]
}
В примере выше jobStatus показан как esriJobExecuting. Другие коды статуса задания приведены в следующей таблице
Коды jobStatus | Описание |
---|---|
esriJobWaiting | Сервер занят, отвечая на другие запросы. |
esriJobSubmitted | Сервер принял запрос на задание. |
esriJobExecuting | Сервер выполняет задание. |
esriJobSucceeded | Сервер успешно выполнил задание, и доступны выходные результаты. |
esriJobFailed | Задание не выполнено из-за недопустимых параметров или других сбоев инструментов геообработки. |
esriJobCancelling | Сервер отменяет выполнение задания на основе клиентского запроса. |
esriJobCancelled | Запрос на выполнение задания был отменен клиентом, и сервер прервал выполнение задания. |
Успешный результат выполнения задачи
Если задание успешно завершено (jobStatus = esriJobSucceeded), сервер создает новые ресурсы для входных и выходных параметров, доступ к которым можно получить через URL-адрес. Ответ на запрос статуса от сервера будет включать информацию о входных данных и URL-адресах результатов. Ниже приводится пример ответа JSON для задачи Построение буфера для точек с одним выходным параметром Output_Polygons. Обратите внимание, что значение выходных и входных параметров является относительным URL-адресом, в отличие от значения результата задачи execute.
Ответ JSON об успешном результате задачи
{
"jobId": "ja892cd2a90d149db9a171fc86ff530b4", "jobStatus": "esriJobSucceeded", "results": {
"Output_Polygons": {
"paramUrl": "results/Output_Polygons"
}
}, "inputs": {
"Input_Features": {
"paramUrl": "inputs/Input_Features"
}
}, "messages": [ ]
}
В конце успешного завершения задания клиент должен отправить запрос на получение каждого выходного параметра. Клиент может получить входной или выходной результат путем использования соответствующих URL-адресов ресурсов. URL результата – http://<job-url>/results/<param-name>. URL входных данных – http://<job-url>/inputs/<param-name>. Ответом этих ресурсов будет значение параметра в любом формате выхода (JSON, KML или HTML) в зависимости от клиентских запросов. Пример ответа JSON на выходной параметр Output_Polygons типа данных GPFeatureRecordSetLayer представлен ниже. Обратите внимание, что в ответе присутствует имя, тип данных и значение параметра.
Ответ JSON на выходной параметр результата
{
"paramName": "Buffer_Polygons", "dataType": "GPFeatureRecordSetLayer", "value": {
"displayFieldName": "", "geometryType": "esriGeometryPolygon", "spatialReference": {
"wkid": 102726, "latestWkid": 102726 }, "fields": [ {
"name": "FID", "type": "esriFieldTypeOID", "alias": "FID"
}, {
"name": "BUFF_DIST", "type": "esriFieldTypeDouble", "alias": "BUFF_DIST"
}, {
"name": "Shape_Length", "type": "esriFieldTypeDouble", "alias": "Shape_Length"
}, {
"name": "Shape_Area", "type": "esriFieldTypeDouble", "alias": "Shape_Area"
}
], "features": [{
"attributes": {
"FID": 1, "BUFF_DIST": 3280.83333333, "Shape_Length": 20613.401930152133, "Shape_Area": 3.381121258723078E7 }, "geometry": {"rings": [[ [ 7643591.499937415, 684676.8331969082 ], [ 7643683.927544653, 684675.5310036391 ] ...more ]]}
}], "exceededTransferLimit": false }
}
В следующем изображении в обобщенном виде представлена коммуникация сервер/клиент для операции submitJob. Обратите внимание на периодические запросы о статусе, отправляемые клиентом для определения состояния задания. Клиент может задать временной интервал между каждым запросом о статусе. Если сервер успешно выполнил задание, он создает ресурсы результатов и входных данных, доступ к которым можно получить через URL-адрес.
Также, если сервис геообработки был опубликован с включенным параметром Просмотреть результат с помощью картографического сервиса, сервер создает результирующий картографический сервис для выходных параметров по окончанию успешного выполнения задачи. Каждый выходной параметр набора геоданных в задаче будет соответствовать слою в картографическом сервисе и будет отображаться в зависимости от символов слоя, определенных для параметров задач.
Сообщение об ошибке
Задание может не выполниться из-за недопустимых входных параметров, недоступных данных проекции или других сбоев геообработки. Если задание завершается с ошибкой, статус задания будет обновлен на esriJobFailed. Клиент должен проверить статус задания с помощью URL-задания для отслеживания сбоев заданий. Ниже представлено сообщение об ошибке JSON для невыполненного задания:
Ответ JSON о статусе в esriJobFailed
{
"jobId": "ja892cd2a90d149db9a171fc86ff530b4", "jobStatus": "esriJobFailed", "messages": [ {
"type": "esriJobMessageTypeInformative", "description": "Submitted."
}, {
"type": "esriJobMessageTypeInformative", "description": "Executing..."
}, {
"type": "esriJobMessageTypeError", "description": "Failed."
}
]
}
После сбоя задачи сервер не будет создавать ресурсы входных данных и результатов. Кроме того, сервер не может создать картографический сервис для сохранения результатов, даже если сервис геообработки имеет сопутствующий результирующий картографический сервис.
Отменить задание
Клиент может отменить операцию submitJob в любое время во время выполнения задания, вызвав операцию Cancel, применимую к этому заданию. URL для операции Cancel – https://<gp-task-url>/cancel. Когда сервер получает запрос на отмену, он изменяет статус задания на esriJobCancelling и пытается прервать выполнение задания. Сервер возвращает сообщение о статусе задания клиенту, как показано ниже:
Ответ JSON на запрос отмены
{
"jobId": "ja892cd2a90d149db9a171fc86ff530b4",
"jobStatus": "esriJobCancelling"
}
Клиент может продолжить опрашивать статус задания с помощью URL-адреса задания и отслеживать ход выполнения отмены задания. Кроме того, клиент может запросить отмену только тех заданий, которые имеют статус esriJobWaiting, esriJobSubmitted или esriJobExecuting. Если запрос на отмену применим к заданиям со статусом esriJobSucceeded или esriJobFailed, сервер возвращает сообщение об ошибке.