Ich brauche einen Nodejs-Scheduler, der Aufgaben in verschiedenen Intervallen zulässt [geschlossen]


127

Ich suche nach einem Knotenjobplan, mit dem ich eine Reihe von Aufgaben in unterschiedlichen Intervallen planen kann. Zum Beispiel,

  • Funktion A alle 30 Sekunden aufrufen
  • Funktion B alle 60 Sekunden aufrufen
  • Funktion C alle 7 Tage aufrufen

Ich möchte auch in der Lage sein, den Prozess zu starten und zu stoppen.

Bisher habe ich mir angesehen:

  • später - die Syntax verwirrt mich, anscheinend können Sie Aufgaben nicht länger als einen Monat planen

  • Agenda - scheint die vielversprechendste zu sein, aber ich bin verwirrt über die Datenbankfunktionalität

  • Zeitplan - zu einfach, kann nicht starten und stoppen

Ich finde die Syntax des letzteren verwirrend.


1
Wie wäre es mit einem setInterval, das genau das klingt, wonach Sie suchen?
Adeneo

Ja, warum nicht setInterval verwenden?
Yalamber

Ich weiß, dass einige von ihnen unter der Haube setInterval verwenden, aber ich suchte nach etwas Höherem ... Ich habe den Zeitplan ( github.com/dbader/schedule ) in Python verwendet und nach einem Knoten gesucht analog dazu
user379468

Versuchen Sie TaskTimer - github.com/onury/tasktimer
Onur Yıldırım

Ich habe Agenda verwendet, nicht schlecht
Aleksandr Golovatyi

Antworten:


223

Ich würde empfehlen node-cron. Es ermöglicht das Ausführen von Aufgaben mit Cron-Mustern, z

'* * * * * *' - runs every second
'*/5 * * * * *' - runs every 5 seconds
'10,20,30 * * * * *' - run at 10th, 20th and 30th second of every minute
'0 * * * * *' - runs every minute
'0 0 * * * *' - runs every hour (at 0 minutes and 0 seconds)

Aber auch komplexere Zeitpläne, z

'00 30 11 * * 1-5' - Runs every weekday (Monday through Friday) at 11:30:00 AM. It does not run on Saturday or Sunday.

Beispielcode : Job wird alle 10 Minuten ausgeführt:

var cron = require('cron');
var cronJob = cron.job("0 */10 * * * *", function(){
    // perform operation e.g. GET request http.get() etc.
    console.info('cron job completed');
}); 
cronJob.start();

Weitere Beispiele finden Sie im Node-Cron- Wiki

Weitere Informationen zur Cron-Konfiguration finden Sie im Cron- Wiki

Ich habe diese Bibliothek in vielen Projekten verwendet und sie macht den Job. Ich hoffe das wird helfen.


ok, ich war von der Cron-Syntax eingeschüchtert, aber dies scheint der beste Ansatz zu sein
user379468

1
Warten Sie, bis ich bald gesprochen habe. Wie würde ich einen Cron schreiben, der alle 5 Sekunden oder alle 30 Sekunden ausgeführt wird?
user379468

3
Die Cron-Syntax könnte beängstigend aussehen . Auf der anderen Seite existiert es schon lange und ist weithin bekannt, so dass es viel Unterstützung für SO
Tom

1
Ich habe gerade meine Antwort so aktualisiert, dass sie - '* / 5 * * * * *' - alle 5 Sekunden oder '* / 30 * * * * *' Sekunden
Tom

1
Ab dem Jahr 2020 und gemäß der offiziellen npm-Seite von node-cron ist die Verwendung dieses Pakets zurückgegangen. Dieses Paket wurde zuletzt vor 2 Jahren in npm veröffentlicht und wird daher nicht regelmäßig aktualisiert. Nun sollte eher ein anderes Paket Node-Cron bevorzugt werden, das anscheinend den gleichen Namen hat, aber eine andere URL hat.
n0noob

36

Ich habe Node-Cron und Agenda verwendet .

node-cron ist eine sehr einfache Bibliothek, die sehr einfache und leicht verständliche APIs wie crontab bietet. Es braucht keine Konfiguration und funktioniert einfach.

var cronJob = require('cron').CronJob;
var myJob = new cronJob('00 30 11 * * 1-5', function(){...});
myJob.start();

Die Agenda ist sehr leistungsfähig und für viel komplexere Dienste geeignet. Denken Sie an ifttt , Sie müssen Millionen von Aufgaben ausführen. Agenda wäre die beste Wahl.

Hinweis: Sie benötigen Mongodb , um Agenda verwenden zu können

var Agenda = require("Agenda");
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-example'}});
agenda.every('*/3 * * * *', 'delete old users');
agenda.start();

1
Wenn ich versuche, Agenda zu verwenden, wird aus irgendeinem Grund ein Fehler angezeigt. ReferenceError: Agenda ist nicht definiert. Ich habe das Paket mit NPM installiert. Muss ich etwas tun, bevor ich die Agenda instanziieren kann?
user379468

2
Ich denke, Sie müssen es für Ihre lokale Variable benötigen. var Agenda = erfordern ("Agenda");
Ryan Wu

1
Ich habe kürzlich einen Blog-Kommentar über Agenda, Projekteinrichtung und Projektstruktur geschrieben. Goo.gl/5sCNBM
Robin Wieruch

1
Beachten Sie, dass Mongodb ausgeführt werden muss, um Agenda
Mark Robson am

1
Bringen Node-Cron oder Agenda einen separaten Knotensystemprozess hervor? Können Sie sie in einem Prozess-Setup mit mehreren Knoten verwenden?
Prasad Silva

14

Ich denke, das beste Ranking ist

1.Knotenplan

2. später

3.crontab

und das Beispiel des Knotenplans ist unten:

var schedule = require("node-schedule");
var rule = new schedule.RecurrenceRule();
//rule.minute = 40;
rule.second = 10;
var jj = schedule.scheduleJob(rule, function(){
    console.log("execute jj");
});

Vielleicht finden Sie die Antwort von Knotenmodulen .



10

Ich habe ein Knotenmodul geschrieben, das einen Wrapper um setInterval bereitstellt, wobei Momentdauern eine deklarative Schnittstelle bereitstellen:

npm jeden Moment installieren

var every = require('every-moment');

var timer = every(5, 'seconds', function() {
    console.log(this.duration);
});

every(2, 'weeks', function() {
    console.log(this.duration);
    timer.stop();
    this.set(1, 'week');
    this.start();
});

https://www.npmjs.com/package/every-moment

https://github.com/raygerrard/every-moment


4
Die Github-Verbindung ist unterbrochen (404)
Kekko12

das ist gut lesbar. Ich habe ein Paket geschrieben, das node-cronals @ Tom-Antwort verwendet. und hat eine schöne Syntax ähnlich Ihrer. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
Shakee93

@ kekko12 Es gibt auf dem NPM: npmjs.com/package/every-moment
Ali Hesari


1

Ich habe dafür ein kleines Modul namens timexe geschrieben :

  • Sein einfacher, kleiner zuverlässiger Code und hat keine Abhängigkeiten
  • Die Auflösung erfolgt in Millisekunden und ist im Laufe der Zeit hochpräzise
  • Cron wie, aber nicht kompatibel (umgekehrte Reihenfolge und andere Verbesserungen)
  • Ich arbeite auch im Browser

Installieren:

npm install timexe

verwenden:

var timexe = require('timexe');
//Every 30 sec
var res1=timexe(”* * * * * /30”, function() console.log(“Its time again”)});

//Every minute
var res2=timexe(”* * * * *”,function() console.log(“a minute has passed”)});

//Every 7 days
var res3=timexe(”* y/7”,function() console.log(“its the 7th day”)});

//Every Wednesdays 
var res3=timexe(”* * w3”,function() console.log(“its Wednesdays”)});

// Stop "every 30 sec. timer"
timexe.remove(res1.id);

Sie können die Start / Stopp-Funktionalität erreichen, indem Sie den Eintrag direkt im timexe-Job-Array entfernen / erneut hinzufügen. Aber es ist keine ausdrückliche Funktion.


4
Sie sollten erwähnen, dass Sie der Autor sind.
a20

12
@ a20 "habe ein kleines Modul geschrieben, um genau das zu tun." bedeutet, dass er der Autor ist, falls Sie beim Lesen übersprungen haben
PirateApp
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.