2016-02-05 24 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

如果您正在处理数据,比如将其添加到数据库中,则需要在完成后终止该流程 - 这可能会在后续回调中使用。 –