Saya memerlukan penjadwal Nodejs yang memungkinkan untuk tugas pada interval yang berbeda [ditutup]

127

Saya mencari jadwal pekerjaan simpul yang akan memungkinkan saya untuk menjadwalkan sejumlah tugas pada interval yang berbeda. Misalnya,

  • fungsi panggilan A setiap 30 detik
  • fungsi panggilan B setiap 60 detik
  • fungsi panggilan C setiap 7 hari

Saya juga ingin dapat memulai dan menghentikan proses.

Sejauh ini, saya telah melihat:

  • nanti - sintaks membingungkan saya, juga ternyata Anda tidak bisa menjadwalkan tugas lebih dari sebulan

  • Agenda - tampaknya yang paling menjanjikan, namun saya bingung tentang fungsi basis data

  • timeplan - terlalu sederhana, tidak dapat memulai dan berhenti

Saya menemukan sintaks yang terakhir membingungkan.

pengguna379468
sumber
1
Bagaimana kalau hanya menggunakan setInterval, terdengar seperti apa yang Anda cari?
adeneo
Ya mengapa tidak menggunakan setInterval?
Yalamber
Saya tahu bahwa di bawah tenda beberapa dari ini menggunakan setInterval, tapi saya mencari sesuatu yang sedikit lebih tinggi ... Saya menggunakan jadwal ( github.com/dbader/schedule ) dengan python, dan saya mencari sebuah simpul analog dengan itu
user379468
Coba TaskTimer - github.com/onury/tasktimer
Onur Yıldırım
Saya menggunakan agenda, tidak buruk
Aleksandr Golovatyi

Jawaban:

223

Saya akan merekomendasikan node-cron. Hal ini memungkinkan untuk menjalankan tugas menggunakan pola Cron misalnya

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

Tetapi juga jadwal yang lebih kompleks misalnya

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

Kode contoh : menjalankan pekerjaan setiap 10 menit:

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

Anda dapat menemukan lebih banyak contoh di wiki node-cron

Lebih lanjut tentang konfigurasi cron dapat ditemukan di cron wiki

Saya telah menggunakan perpustakaan itu di banyak proyek dan berhasil. Saya harap itu akan membantu.

Tom
sumber
ok, saya terintimidasi oleh sintaks cron, tapi ini sepertinya pendekatan yang terbaik
user379468
1
tunggu saya berbicara segera, bagaimana saya akan menulis cron yang berjalan setiap 5 detik atau setiap 30 detik?
user379468
3
sintaks cron mungkin terlihat menakutkan . Di sisi lain itu ada untuk waktu yang lama dan secara luas diketahui sehingga akan mendapatkan banyak dukungan pada SO
Tom
1
Baru saja memperbarui respons saya sehingga - '* / 5 * * * * *' - setiap 5 detik atau '* / 30 * * * * *' detik
Tom
1
Pada tahun 2020, dan sesuai dengan halaman npm resmi node-cron , penggunaan paket ini telah menurun. Paket ini terakhir diterbitkan pada npm 2 tahun yang lalu, karenanya tidak diperbarui secara teratur. Sekarang, bukan paket lain node-cron yang tampaknya memiliki nama yang sama tetapi berjalan dengan URL yang berbeda harus lebih disukai.
n0noob
36

Saya telah menggunakan node-cron dan agenda .

node-cron adalah pustaka yang sangat sederhana, yang menyediakan api yang sangat mendasar dan mudah dipahami seperti crontab. Tidak perlu konfigurasi dan hanya berfungsi.

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

Agenda sangat kuat dan cocok untuk layanan yang jauh lebih kompleks. Pikirkan tentang ifttt , Anda harus menjalankan jutaan tugas. Agenda akan menjadi pilihan terbaik.

Catatan: Anda perlu Mongodb untuk menggunakan 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
sumber
1
karena beberapa alasan, ketika saya mencoba menggunakan Agenda saya mendapatkan error ReferenceError: Agenda tidak didefinisikan. Saya menginstal paket dengan NPM, apakah saya harus melakukan sesuatu sebelum membuat agenda?
user379468
2
saya pikir Anda harus meminta variabel lokal Anda. var Agenda = membutuhkan ("Agenda");
Ryan Wu
1
Baru-baru ini saya menulis komentar blog tentang agenda, pengaturan proyek dan struktur proyek goo.gl/5sCNBM
Robin Wieruch
1
Perhatikan bahwa Anda perlu menjalankan Mongodb untuk menggunakan Agenda
Mark Robson
1
Apakah node-cron atau agenda menelurkan proses sistem simpul yang terpisah? Bisakah Anda menggunakannya dalam pengaturan proses multi-simpul?
Prasad Silva
14

Saya pikir peringkat terbaiknya adalah

1.node-jadwal

2. terakhir

3.crontab

dan contoh jadwal simpul adalah di bawah ini:

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

Mungkin Anda dapat menemukan jawabannya dari modul simpul .

Richard Xue
sumber
1
Suka sintaksisnya, terima kasih sudah berbagi
Overdrivr
10

Saya telah menulis modul simpul yang menyediakan pembungkus setInterval menggunakan durasi saat menyediakan antarmuka deklaratif:

npm instal setiap saat

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
sumber
4
Tautan github rusak (404)
kekko12
ini sangat mudah dibaca. Saya telah menulis paket yang digunakan node-cronsebagai jawaban @Tom. dan memiliki sintaks yang bagus mirip dengan Anda. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93
@ kekko12 Ada di NPM: npmjs.com/package/every-moment
Ali Hesari
1

Saya telah menulis modul kecil untuk melakukan hal itu, yang disebut timexe :

  • Sederhana, kode andal kecil dan tidak memiliki dependensi
  • Resolusi dalam milidetik dan memiliki presisi tinggi dari waktu ke waktu
  • Suka Cron, tetapi tidak kompatibel (urutan terbalik dan Perbaikan lainnya)
  • Saya bekerja di browser juga

Install:

npm install timexe

menggunakan:

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

Anda dapat mencapai fungsionalitas mulai / hentikan dengan menghapus / menambahkan kembali entri secara langsung di array pekerjaan timexe. Tapi itu bukan fungsi ekspres.

Simon Rigét
sumber
4
Anda harus menyebutkan bahwa Andalah penulisnya.
20
13
@ a20 "telah menulis modul kecil untuk melakukan hal itu." berarti dia adalah penulis jika Anda melewatkan saat membaca
PirateApp