2016-02-05 54 views
1

我知道使用一個setting.job文件可以gracefully shutdown an Azure WebJob。這是我的文件:如何正常停止爲Nodejs寫的Azure WebJob

{ 
     "schedule": "0 */10 * * * *", 
     "stopping_wait_time": 120 
    } 

我已經寫了一個JavaScript的WebJob。 WebJob在Nodejs上運行。它按需配置,並由setting.job每10分鐘觸發一次。由於某些原因,我的setting.job文件不能正常關閉Web Job。它總是失敗。

也許我失去了一些東西還是不明白WebJob兩端完全如何關機,但我在run.js一個討厭的調整結束:

setTimeout(function() { 
     process.exit(); 
    }, 30000); 

的一段代碼在的結束時執行腳本。我想知道在我使用的解決方案旁邊是否有更優雅的解決方案。

run.js例如:

const http = require('http'); 
    const request = require('request'); 
    const fb = require('firebase'); 

    request(process.env.SourceUrl, function (error, response, body) { 
     'use strict'; 
      if (!error && response.statusCode == 200) { 
       // Process data from body 
      } else { 
       console.log(error); 
      } 
    }); 

    // Nasty hack to end gracefully 
    setTimeout(function() { 
     process.exit(); 
    }, 6000); 
+0

當你在本地運行你的工作時,它本身是否關閉,或者你需要ctrl + c來逃脫​​? –

+0

是的,大多數時候我只是關閉cmd窗口。 – James

+1

對不起,我不確定我的理解。你按ctrl + c /關閉窗口?如果是這種情況,那麼很可能您的WebJob中仍然存在偵聽器/回調。如果你發佈了一些代碼,我可以幫你找到這個。 (但不要分享任何你不想讓人看到的東西:)) –

回答

1

我覺得優雅的方式是完全等待工作完成,而不是在處理中斷。

const http = require('http'); 
const request = require('request'); 
const fb = require('firebase'); 

var sig = -1; 

request(process.env.SourceUrl, function (error, response, body) { 
    'use strict'; 
     if (!error && response.statusCode == 200) { 
      // Process data from body 

      sig = 0; 
     } else { 
      console.log(error); 
      sig = 1; 
     } 
}); 

setInterval(function() { 
    if(sig > -1) { 
     process.exit(sig); 
    } 
}, 6000); 
+0

嗨,彼得,使用'setInterval'而不是'setTimeout'有什麼區別? – James

+1

@James函數'setTimeout'只在超時後運行一次代碼/函數。如果超時時間太短,可能無法確定完成請求。或者進程推遲退出,如果超時太長,不會立即退出。 –

+0

我選擇此答案作爲解決方案,因爲實際上它與所實施的解決方案非常相似。非常感謝支持! – James

0

的更清潔的方式實現自己的目標是調用process.exit你完成你的業務邏輯之後。這使您可以完全控制WebJob的生命週期。

const http = require('http'); 
const request = require('request'); 
const fb = require('firebase'); 

request(process.env.SourceUrl, function (error, response, body) { 
    'use strict'; 
     if (!error && response.statusCode == 200) { 
      // Process data from body 

      //When finished 
      process.exit(0); 
     } else { 
      console.log(error); 
      process.exit(1); // provide a non-zero error, because the job failed 
     } 
}); 
+0

顯然殺死這個進程,所以突然不允許整個業務邏輯成功完成。看到一些東西仍在幕後運行,並且數據沒有到達最終的終點。 – James

+0

如果您正在處理數據,比如將其添加到數據庫中,則需要在完成後終止該流程 - 這可能會在後續回調中使用。 –