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.