如何正常停止为Nodejs编写的Azure WebJob

我知道使用setting.job文件可以正常closuresAzure WebJob 。 这是我的文件:

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

我用JavaScript写了一个WebJob。 WebJob运行在Nodejs上。 它按需configuration,每隔10分钟由setting.job触发。 出于某种原因,我的setting.job文件不能正常closuresWebJob。 它总是失败。

也许我错过了一些东西,或者完全不了解WebJob的closures是如何结束的,但是我在run.js中做了一个糟糕的调整:

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

这段代码在脚本的末尾执行。 我想知道是否有一个更优雅的解决scheme旁边,我正在使用。

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); 

我觉得优雅的方式是等待完成工作,而不是在处理中断。

 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); 

实现目标的更清晰的方法是在完成业务逻辑之后调用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 } });