J'ai besoin d'un planificateur Nodejs qui permet des tâches à des intervalles différents [fermé]

127

Je suis à la recherche d'un planning de travail de nœud qui me permettra de planifier un certain nombre de tâches à différents intervalles. Par exemple,

  • appeler la fonction A toutes les 30 secondes
  • appeler la fonction B toutes les 60 secondes
  • appeler la fonction C tous les 7 jours

Je veux aussi pouvoir démarrer et arrêter le processus.

Jusqu'à présent, j'ai regardé:

  • plus tard - la syntaxe me confond, aussi apparemment vous ne pouvez pas planifier des tâches au-delà d'un mois

  • agenda - semble le plus prometteur, mais je ne comprends pas la fonctionnalité de la base de données

  • calendrier - trop simple, ne peut pas démarrer et s'arrêter

Je trouve la syntaxe de ce dernier déroutante.

utilisateur379468
la source
1
Que diriez-vous d'utiliser simplement un setInterval, qui ressemble exactement à ce que vous recherchez?
adeneo
Oui, pourquoi ne pas utiliser setInterval?
Yalamber
Je sais que sous le capot, certains d'entre eux utilisent setInterval, mais je cherchais quelque chose d'un peu plus haut niveau ... J'avais l'habitude d'utiliser schedule ( github.com/dbader/schedule ) en python, et je cherchais un nœud analogique à cela
user379468
Essayez TaskTimer - github.com/onury/tasktimer
Onur Yıldırım
J'ai utilisé l'agenda, pas mal
Aleksandr Golovatyi

Réponses:

223

Je recommanderais node-cron. Il permet d'exécuter des tâches en utilisant des modèles Cron, par exemple

'* * * * * *' - 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)

Mais aussi des horaires plus complexes, par exemple

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

Exemple de code : exécution du travail toutes les 10 minutes:

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

Vous pouvez trouver plus d'exemples dans le wiki node-cron

Plus d'informations sur la configuration de cron peuvent être trouvées sur le wiki de cron

J'ai utilisé cette bibliothèque dans de nombreux projets et elle fait le travail. J'espère que cela aidera.

À M
la source
ok, j'ai été intimidé par la syntaxe cron, mais cela semble être la meilleure approche
user379468
1
attendez que j'ai parlé bientôt, comment pourrais-je écrire un cron qui s'exécute toutes les 5 secondes ou toutes les 30 secondes?
user379468
3
La syntaxe cron peut sembler effrayante . D'un autre côté, il existe depuis longtemps et est largement connu, il recevra donc beaucoup de soutien sur SO
Tom
1
Je viens de mettre à jour ma réponse pour qu'elle soit - '* / 5 * * * * *' - toutes les 5 secondes ou '* / 30 * * * * *' secondes
Tom
1
Depuis l'année 2020, et selon la page officielle npm de node-cron , l'utilisation de ce package a diminué. Ce package a été publié pour la dernière fois dans npm il y a 2 ans et n'est donc pas régulièrement mis à jour. Maintenant, plutôt un autre paquet node-cron qui a apparemment le même nom mais qui passe par une URL différente devrait être préféré.
n0noob le
36

J'ai utilisé node-cron et agenda .

node-cron est une bibliothèque très simple, qui fournit des API très basiques et faciles à comprendre comme crontab. Il n'a besoin d'aucune configuration et fonctionne juste.

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

agenda est très puissant et adapté à des services beaucoup plus complexes. Pensez à ifttt , vous devez exécuter des millions de tâches. l’ordre du jour serait le meilleur choix.

Remarque: vous avez besoin de Mongodb pour utiliser Agenda

var Agenda = require("Agenda");
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-example'}});
agenda.every('*/3 * * * *', 'delete old users');
agenda.start();
Ryan Wu
la source
1
pour une raison quelconque, lorsque j'essaie d'utiliser Agenda, j'obtiens une erreur ReferenceError: Agenda n'est pas défini. J'ai installé le package avec NPM, dois-je faire quelque chose avant d'instancier l'agenda?
user379468
2
Je pense que vous devez l'exiger pour votre variable locale. var Agenda = require ("Agenda");
Ryan Wu
1
J'ai récemment écrit un commentaire de blog sur l'agenda, la configuration du projet et la structure du projet goo.gl/5sCNBM
Robin Wieruch
1
Notez que vous devez exécuter Mongodb pour utiliser Agenda
Mark Robson
1
Nœud-cron ou agenda engendrent-ils un processus système de nœuds distinct? Pouvez-vous les utiliser dans une configuration de processus multi-nœuds?
Prasad Silva
14

Je pense que le meilleur classement est

1. noeud-programme

2. plus tard

3.crontab

et l'exemple de noeud-planning est ci-dessous:

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

Vous pouvez peut-être trouver la réponse dans les modules de nœuds .

Richard Xue
la source
1
J'adore la syntaxe, merci pour le partage
Overdrivr
10

J'ai écrit un module de nœud qui fournit un wrapper autour de setInterval en utilisant des durées de moment fournissant une interface déclarative:

npm installer à chaque instant

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

Raygerrard
la source
4
Le lien github est rompu (404)
kekko12
c'est très lisible. J'ai écrit un package qui utilise node-croncomme réponse @Tom. et a une belle syntaxe similaire à la vôtre. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93
@ kekko12 Il y a sur le NPM: npmjs.com/package/every-moment
Ali Hesari
1

J'ai écrit un petit module pour faire exactement cela, appelé timexe :

  • Son code simple, petit et fiable et sans dépendances
  • La résolution est en millisecondes et a une haute précision dans le temps
  • Cron comme, mais pas compatible (ordre inversé et autres améliorations)
  • Je travaille aussi dans le navigateur

Installer:

npm install timexe

utilisation:

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

vous pouvez obtenir la fonctionnalité de démarrage / arrêt en supprimant / en ajoutant à nouveau l'entrée directement dans le tableau de tâches timexe. Mais ce n'est pas une fonction expresse.

Simon Rigét
la source
4
Vous devez mentionner que vous êtes l'auteur.
a20
13
@ a20 "a écrit un petit module pour faire exactement cela." signifie qu'il est l'auteur au cas où vous auriez sauté pendant la lecture
PirateApp