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

How to gracefully stop an Azure WebJob written for Nodejs

我知道使用 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);

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

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

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