当地理处理服务以异步执行模式发布时,服务的地理处理任务将支持“提交作业”(submitJob) 操作。submitJob 操作适合运行时间长、处理大型数据集的任务。同样,地理处理服务器可为成功的作业操作创建结果地图服务。因此,submitJob 操作适用于不可传输的工具输出(如 TIN、CAD 等)以及 Web 应用程序无法渲染的 RaterData 输出。这种情况下的输出可由服务器作为结果地图服务渲染,客户端可将结果地图服务添加到其 Web 应用程序。
使用 submitJob 提交作业
submitJob 操作的 URL 模板为 http://<gp-task-url>/submitJob。客户端可通过 submitJob 操作发送任务运行请求。提交作业时,任务的输入参数构建为 URL 并发送到类似于 executeTask 操作的服务器上。当接收到 submitJob 操作请求时,服务器将创建具有唯一 ID(称为 jobId)的作业资源并将其返回到客户端。地理处理任务 submitJob 操作的服务器响应将具有唯一作业标识符 (jobId) 和作业状态 (jobStatus),如下所示。
submitJob 请求的 JSON 响应
{ "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 的相关信息。输出参数为 Output_Polygons 缓冲点任务 JSON 响应的示例如下所示。请注意,输出和输入参数的值是相对 URL,与执行任务的结果值相反。
成功任务结果的 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/AMF/HTML 输出格式。数据类型 GPFeatureRecordSetLayer 的 Output_Polygons 输出参数的 JSON 响应示例如下。请注意,响应包含参数名称、数据类型和参数值。
结果输出参数的 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 如下所示。
具有 esriJobFailed 状态的状态响应 JSON
{
"jobId": "ja892cd2a90d149db9a171fc86ff530b4",
"jobStatus": "esriJobFailed",
"messages": [
{
"type": "esriJobMessageTypeInformative",
"description": "Submitted."
},
{
"type": "esriJobMessageTypeInformative",
"description": "Executing..."
},
{
"type": "esriJobMessageTypeError",
"description": "Failed."
}
]
}
任务失败后,服务器将不会创建输入和结果资源。同样,即便地理处理服务附有结果地图服务,服务器仍无法创建结果地图服务。
取消作业
在作业执行过程中,客户端可随时放弃 submitJob 操作,并对作业调用“取消”操作。“取消”作业的 URL 为 http://<gp-task-url>/cancel。当接收到取消请求时,服务器会将作业状态修改为 esriJobCancelling,同时尝试终止执行作业。服务器将向客户端返回以下作业状态消息。
取消请求的 JSON 响应{
"jobId": "ja892cd2a90d149db9a171fc86ff530b4",
"jobStatus": "esriJobCancelling"
}
客户端可继续使用作业 URL 对作业状态进行轮询,并追踪作业取消的进程。而且,客户端只能请求取消处于 esriJobWaiting、esriJobSubmitted 或 esriJobExecuting 状态的作业。如果请求取消处于 esriJobSucceeded 或 esriJobFailed 状态的作业,则服务器将返回错误信息。