天天看点

Geoprocessor Job does not exist or is inaccessible

在应用ArcGIS api for JavaScript 进行GP等值线调用的时候,F12调试出现了"jobid" Job does not exist or is inaccessible 错误,意思是这个GP Task的生成的结果不存在或不可用;

但是装载GP Task结果的C:\arcgisserver\arcgisjobs目录下确实生成了这个jobid的结果,经过仔细分析与网上查找,觉得问题应该出现在:gp.submitJob(parms, jobResult_Async);

也就是说GP Task还在执行的时候,jobResult_Async(亦或者是在它前面的函数)就已经执行了并且去调还未完全执行 完毕的任务的结果,那肯定是调不到的了,尤其是耗时比较长的GP任务,更是要出错的了;(这个问题是在ArcGIS S 10.0下遇到的,应该是一个bug吧)

解决方法:

方法1:异步调用换成同步调用(可以解决)

将原有的异步执行gp.submitJob(parms, jobResult_Async)改成:(以等值线为例)

gp.execute(parms,jobResult_Tb);
function jobResult_Tb(result){
	addResults(result[0].value.features);
}
function addResults(results) {
var features=results;
	for (var f = 0, fl = features.length; f < fl; f++) {
		var feature = features[f];
		var symbol = new esri.symbols.SimpleLineSymbol(
				esri.symbols.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([
						160, 32, 240 ]), 1);
		feature.setSymbol(symbol);
		esrimap.graphics.add(feature);
	}
}
           

经过亲自实践,可以解决问题;

方法2:setUpdateDelay(可以解决) 在gp.submitJob(parms, jobResult_Async)之前加上:

gp.setUpdateDelay(3000);
gp.submitJob(parms, jobResult_Async);
//异步 result
function jobResult_Async(result) {
	jobId = result.jobId;
	var status = result.jobStatus;
	if (status === esri.tasks.JobInfo.STATUS_SUCCEEDED) {
		// 成功之后,将其中的结果取出来,当然这也是参数名字
		// 在模型中,想要取出中间结果,需要设置为模型参数
		gp.getResultData(jobId, "Contour_Output", addResults);
	}
}
function addResults(results) {
	var features = results.value.features;//注意与同步执行的区别
	for (var f = 0, fl = features.length; f < fl; f++) {
		var feature = features[f];
		var symbol = new esri.symbols.SimpleLineSymbol(
				esri.symbols.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([
						160, 32, 240 ]), 1);
		feature.setSymbol(symbol);
		// gl_stations.add(feature);
		esrimap.graphics.add(feature);
	}
}
           

setUpdateDelay(5000)很有意思,经过调试分析笔者发现: 当到达5秒时如果GP任务已经执行结束,则执行jobResult_Async 如果5秒了GP任务还正在执行(arcgisjobs中文件正在生成),则推迟到5*2也就是10秒后再执行jobResult_Async,无论任务是否执行完毕; 也就是说如果想用此法解决出现的问题,那么就要预估也就是看arcgisjobs下执行完GP任务大概需要多长时间,然后再加一点时间,比如用时15秒,那么这里可以写setUpdateDelay(20000、25000),如果某一次任务在20秒后还没执行完,则程序将等待到40秒再去执行jobResult_Async,如果40秒后还没执行完,不好意思,会报之前同样的的错误; 方法3:gpError(这个解决问题的方法很蛋疼) gp.submitJob后面可以跟一个gpError函数,也就是当GP 任务出现问题的时候执行它

function gpError(e) {
    if (e.message.search("does not exist or is inaccessible") > -1) {
        var jobId = e.message.replace(/Job '([a-z,0-9]*)' does not exist or is inaccessible\./, "$1");
        gp.getResultData(jobId, "Output_PDF");
    }
    else {
        showDialog(dojo.string.substitute('<h1>Error: ${error}</h1>', { error: e.message }));
    }
}
           

怎么样?够恶心吧,在出现错误的函数中去调用任务结果...没有试过,看着就蛋疼; 方法4:ArcGIS 10.1 及以上版本(没有尝试) 本错误是在ArcGIS 10.0中遇到的,网上有说换成高版本的就好了,这个是10.0的bug 由于系统涉及了好多GP服务,如果换版本还要有大量改动,所以笔者没有尝试,如果哪位读者尝试了可以留言告知 方法5:ArcGIS Server发布GP 与 程序分在两个机器上(没有尝试) 网上解决方法还有说将GP服务与程序分在两个机器上就不会有该问题了,由于不符合本项目部署条件,笔者没有尝试,如果哪位读者尝试了可以留言告知 谢谢大家!

继续阅读