Görevlere farklı aralıklarla [kapalı] izin veren bir Nodejs zamanlayıcıya ihtiyacım var


127

Farklı aralıklarla bir dizi görevi planlamama izin verecek bir düğüm iş programı arıyorum. Örneğin,

  • A işlevini her 30 saniyede bir çağırın
  • her 60 saniyede bir B işlevini çağırın
  • 7 günde bir C işlevini çağırın

Ayrıca süreci başlatıp durdurabilmek istiyorum.

Şimdiye kadar baktım:

  • daha sonra - sözdizimi kafamı karıştırıyor, ayrıca görünüşe göre görevleri bir aydan sonra planlayamıyorsunuz

  • gündem - en umut verici görünüyor, ancak veritabanı işlevselliği konusunda kafam karıştı

  • zaman planı - çok basit, başlayıp duramaz

İkincisinin sözdizimini kafa karıştırıcı buluyorum.


1
Bir setInterval kullanmaya ne dersiniz, tam olarak peşinde olduğunuza benziyor?
adeneo

Evet neden setInterval kullanılmıyor?
Yalamber

Kaputun altında bunlardan bazılarının setInterval kullandığını biliyorum, ancak biraz daha yüksek bir seviye arıyordum ... python'da zamanlama ( github.com/dbader/schedule ) kullanıyordum ve bir düğüm arıyordum buna benzer
user379468


Gündem kullandım, fena değil
Aleksandr Golovatyi

Yanıtlar:


223

Tavsiye ederim node-cron. Cron kalıplarını kullanarak görevleri çalıştırmaya izin verir, örneğin

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

Ancak daha karmaşık programlar, örn.

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

Örnek kod : Her 10 dakikada bir iş çalıştırma:

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

Node-cron wiki'de daha fazla örnek bulabilirsiniz

Cron yapılandırması hakkında daha fazla bilgi cron wiki'de bulunabilir.

Bu kütüphaneyi birçok projede kullanıyorum ve işi yapıyor. Umarım bu yardımcı olur.


Tamam, cron sözdizimi beni korkuttu, ancak bu en iyi yaklaşım gibi görünüyor
user379468

1
Bekle yakında konuştum, nasıl 5 saniyede bir veya her 30 saniyede bir çalışan bir cron yazabilirim?
user379468

3
cron sözdizimi korkutucu görünebilir . Öte yandan, uzun zamandır var ve yaygın olarak biliniyor, bu nedenle SO'da çok fazla destek alacak
Tom

1
Yanıtımı - '* / 5 * * * * *' - her 5 saniyede bir veya '* / 30 * * * * *' saniye olacak şekilde güncelledim
Tom

1
2020 yılı itibariyle ve node-cron resmi npm sayfasına göre bu paketin kullanımı azalmıştır. Bu paket en son 2 yıl önce npm'de yayınlandı, dolayısıyla düzenli olarak güncellenmiyor. Şimdi, görünüşte aynı ada sahip ancak farklı URL ile giden başka bir node-cron paketi tercih edilmelidir.
n0noob

36

Kullandığım düğüm-cron'u ve gündemi .

node-cron , crontab gibi çok basit ve anlaşılması kolay api sağlayan çok basit bir kitaplıktır. Herhangi bir yapılandırmaya ihtiyaç duymaz ve sadece çalışır.

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

gündem çok güçlüdür ve çok daha karmaşık hizmetler için uygundur. İfttt'i düşünün , milyonlarca görev yürütmelisiniz . gündem en iyi seçim olacaktır.

Not: Agenda'yı kullanmak için Mongodb'a ihtiyacınız var

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

1
Nedense Agenda'yı kullanmaya çalıştığımda bir hata alıyorum ReferenceError: Agenda tanımlı değil. Paketi NPM ile kurdum, gündemi somutlaştırmadan önce herhangi bir şey yapmam gerekir mi?
user379468

2
yerel değişkeninize ihtiyaç duymanız gerektiğini düşünüyorum. var Gündem = gerektirir ("Gündem");
Ryan Wu

1
Yakın zamanda gündem, proje kurulumu ve proje yapısı hakkında bir blog yorumu yazdım goo.gl/5sCNBM
Robin Wieruch

1
Ajandayı kullanmak için Mongodb'a ihtiyacınız olduğunu unutmayın
Mark Robson

1
Node-cron veya ajenda ayrı bir düğüm sistemi sürecini mi ortaya çıkarır? Bunları çok düğümlü işlem kurulumunda kullanabilir misiniz?
Prasad Silva

14

Bence en iyi sıralama

1.node-zamanlama

2.later

3.crontab

ve düğüm çizelgesi örneği aşağıdadır:

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

Belki cevabı düğüm modüllerinden bulabilirsiniz .


1
Sözdizimini seviyorum, paylaştığınız için teşekkürler
Overdrivr

10

Bir bildirime dayalı arabirim sağlayan moment sürelerini kullanarak setInterval etrafında bir sarmalayıcı sağlayan bir düğüm modülü yazdım:

npm her an yükle

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
GitHub

bu çok okunabilir. node-cron@Tom cevabı kullanan bir paket yazdım. ve sizinkine benzer güzel bir sözdizimi var. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93



1

Bunu yapmak için timexe adında küçük bir modül yazdım :

  • Basit, küçük, güvenilir kodu ve bağımlılıkları yok
  • Çözünürlük milisaniye cinsindendir ve zaman içinde yüksek hassasiyete sahiptir
  • Cron gibi, ancak uyumlu değil (ters düzen ve diğer İyileştirmeler)
  • Ben de tarayıcıda çalışıyorum

Yüklemek:

npm install timexe

kullanın:

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

doğrudan timexe iş dizisine girişi kaldırarak / yeniden ekleyerek başlatma / durdurma işlevini elde edebilirsiniz. Ancak bu, ekspres bir işlev değildir.


4
Yazar olduğunuzu söylemelisiniz.
a20

13
@ a20 "tam da bunu yapmak için küçük bir modül yazmış.", okurken atlamanız durumunda yazarın kendisi olduğu anlamına gelir
PirateApp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.