web-dev-qa-db-ja.com

Node.jsジョブを5分ごとにスケジュールする

Node.jsは初めてです。 node.jsが5分ごとにmongodbにクエリを実行し、特定のデータを取得してから、socket.ioを使用して、サブスクライブしたWebクライアントがこのデータにアクセスできるようにする必要があります。私はすでにsocket.ioパーツを設定しており、もちろんmongoです。node.jsを5分ごとに実行し、socket.ioに投稿する方法を知る必要があります。

これに最適なソリューションは何ですか?

ありがとう

26
Paul
var minutes = 5, the_interval = minutes * 60 * 1000;
setInterval(function() {
  console.log("I am doing my 5 minutes check");
  // do your stuff here
}, the_interval);

そのコードをnode_regular_job.jsとして保存して実行します:)

68
alessioalex

これは、管理する非同期タスクがいくつかある場合に行うべき方法です。

(function schedule() {
    background.asyncStuff().then(function() {
        console.log('Process finished, waiting 5 minutes');
        setTimeout(function() {
            console.log('Going to restart');
            schedule();
        }, 1000 * 60 * 5);
    }).catch(err => console.error('error in scheduler', err));
})();

ただし、ジョブがいつ開始されるかは保証できませんが、ジョブの実行に5分以上かかる場合は、少なくともジョブを同時に複数回実行することはできません。

非同期ジョブのスケジュールには引き続きsetIntervalを使用できますが、そうする場合は、少なくとも処理済みのタスクに「処理中」のフラグを付けて、ジョブが2回前にスケジュールされるようにする必要があります以前の処理が完了すると、ロジックはまだ処理されているタスクを処理しないことを決定する場合があります。

2

@ alessioalexには正しい答えがあります コードからジョブを制御するときですが、CLIソリューションを探すためにここでつまずく人もいます。あなたは打ち負かすことはできません sloth-cli

たとえば、sloth 5 "npm start" 走る npm start 5分ごと。

このプロジェクト には例がありますpackage.json 使用法。

2
John Vandivier

このパッケージ を使用できます

var cron = require('node-cron');

cron.schedule('*/5 * * * *', () => {
  console.log('running a task 5 minutes');
});
0
Hiu D