天天看點

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服務與程式分在兩個機器上就不會有該問題了,由于不符合本項目部署條件,筆者沒有嘗試,如果哪位讀者嘗試了可以留言告知 謝謝大家!

繼續閱讀