Potrzebuję harmonogramu Nodejs, który umożliwia wykonywanie zadań w różnych odstępach czasu [zamknięte]


131

Szukam harmonogramu pracy węzła, który pozwoli mi zaplanować szereg zadań w różnych odstępach czasu. Na przykład,

  • wywołanie funkcji A co 30 sekund
  • wywołać funkcję B co 60 sekund
  • wywołanie funkcji C co 7 dni

Chcę również móc rozpocząć i zakończyć ten proces.

Do tej pory przyjrzałem się:

  • później - wprawia mnie w zakłopotanie składnia, najwyraźniej też nie możesz zaplanować zadań dłużej niż miesiąc

  • agenda - wydaje się najbardziej obiecująca, jednak jestem zdezorientowany co do funkcjonalności bazy danych

  • plan czasu - zbyt prosty, nie można uruchomić i zatrzymać

Uważam, że składnia tego ostatniego jest myląca.


1
A co powiesz na użycie setInterval, brzmi jak dokładnie to, czego szukasz?
adeneo,

Tak, dlaczego nie użyć setInterval?
Yalamber

Wiem, że pod maską niektóre z nich używają setInterval, ale szukałem czegoś trochę wyższego poziomu ... Zwykłem używać harmonogramu ( github.com/dbader/schedule ) w pythonie i szukałem węzła analogicznie do tego
user379468


Skorzystałem z agendy, nieźle
Aleksandr Golovatyi

Odpowiedzi:


229

Polecam node-cron. Pozwala na uruchamianie zadań z wykorzystaniem wzorców Crona np

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

Ale także bardziej złożone harmonogramy np

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

Przykładowy kod : uruchamianie zadania co 10 minut:

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

Więcej przykładów znajdziesz w wiki node-cron

Więcej informacji o konfiguracji crona można znaleźć na stronie cron wiki

Używam tej biblioteki w wielu projektach i spełnia swoje zadanie. Mam nadzieję, że to pomoże.


1
ok, byłem onieśmielony składnią crona, ale to wydaje się być najlepszym podejściem
user379468

1
czekaj, z którym rozmawiałem wkrótce, jak napisać crona, który będzie uruchamiany co 5 sekund lub co 30 sekund?
user379468,

3
składnia cron może wyglądać przerażająco . Z drugiej strony istnieje od dawna i jest powszechnie znany, więc otrzyma duże wsparcie na SO
Tom

1
Właśnie zaktualizowałem moją odpowiedź, aby była to - „* / 5 * * * * *” - co 5 sekund lub „* / 30 * * * * *” sekund
Tom,

1
Od roku 2020 i zgodnie z oficjalną stroną npm node-cron , użycie tego pakietu spadło. Ten pakiet był ostatnio publikowany w npm 2 lata temu, stąd nie jest regularnie aktualizowany. Teraz raczej powinien być preferowany inny pakiet node-cron, który najwyraźniej ma tę samą nazwę, ale ma inny adres URL.
n0noob

37

Użyłem node-cron i agendy .

node-cron jest bardzo prostą biblioteką, która zapewnia bardzo proste i łatwe do zrozumienia API, takie jak crontab. Nie wymaga żadnej konfiguracji i po prostu działa.

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

program ma bardzo duże możliwości i nadaje się do znacznie bardziej złożonych usług. Pomyśl o ifttt , musisz wykonywać miliony zadań. porządek obrad byłby najlepszym wyborem.

Uwaga: do korzystania z Agendy potrzebny jest Mongodb

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

1
z jakiegoś powodu, kiedy próbuję użyć Agendy, pojawia się błąd ReferenceError: Agenda nie jest zdefiniowana. Zainstalowałem pakiet z NPM, czy muszę coś zrobić przed utworzeniem agendy?
user379468,

2
myślę, że musisz wymagać tego w swojej zmiennej lokalnej. var Agenda = require ("Agenda");
Ryan Wu,

1
Niedawno napisałem komentarz na blogu o agendzie, konfiguracji projektu i strukturze projektu goo.gl/5sCNBM
Robin Wieruch

1
Pamiętaj, że musisz uruchomić Mongodb, aby korzystać z Agendy
Mark Robson

1
Czy node-cron lub agenda tworzą oddzielny proces systemu węzłów? Czy możesz ich użyć w konfiguracji procesu wielowęzłowego?
Prasad Silva

15

Myślę, że najlepszy ranking to

1. harmonogram węzłów

2. później

3.crontab

a przykład harmonogramu węzłów jest poniżej:

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

Może znajdziesz odpowiedź w modułach węzłów .


1
Uwielbiam składnię, dzięki za udostępnienie
Overdrivr

10

Napisałem moduł węzła, który zapewnia otokę wokół setInterval przy użyciu czasów trwania momentów zapewniających deklaratywny interfejs:

npm instaluj w każdej chwili

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
Link do github jest uszkodzony (404)
kekko12

jest to bardzo czytelne. napisałem pakiet, który używa node-cronodpowiedzi @Tom. i ma ładną składnię podobną do twojej. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93

@ kekko12 Na NPM jest: npmjs.com/package/every-moment
Ali Hesari


1

W tym celu napisałem mały moduł o nazwie timexe :

  • Jest to prosty, mały niezawodny kod i nie ma żadnych zależności
  • Rozdzielczość jest podawana w milisekundach i ma wysoką precyzję w czasie
  • Cron jak, ale nie kompatybilny (odwrócona kolejność i inne ulepszenia)
  • Pracuję też w przeglądarce

Zainstalować:

npm install timexe

posługiwać się:

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

Funkcję start / stop można osiągnąć, usuwając / ponownie dodając wpis bezpośrednio w tablicy zadań timexe. Ale to nie jest funkcja ekspresowa.


4
Powinieneś wspomnieć, że jesteś autorem.
a20

15
@ a20 „napisał mały moduł, który właśnie to robi” oznacza, że ​​jest autorem na wypadek, gdybyś pominął podczas czytania
PirateApp,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.