如何优雅地停止为Nodejs编写的Azure WebJob

时间:2016-02-05 03:16:42

标签: javascript node.js azure azure-webjobs

我知道使用setting.job文件可以gracefully shutdown an Azure WebJob。这是我的档案:

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

我用javascript写了一个WebJob。 WebJob在Nodejs上运行。它按需配置,并由setting.job每10分钟触发一次。出于某种原因,我的setting.job文件没有正常关闭WebJob。它总是以失败告终。

也许我错过了某些内容,或者完全不了解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);

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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
        }
});