Мені потрібен планувальник Nodejs, який дозволяє виконувати завдання через різні інтервали [закрито]


127

Я шукаю розклад завдань вузла, який дозволить мені запланувати ряд завдань з різними інтервалами. Наприклад,

  • функція виклику A кожні 30 секунд
  • функція виклику B кожні 60 секунд
  • функція виклику C кожні 7 днів

Я також хочу мати можливість запустити і зупинити процес.

Поки я переглядав:

  • пізніше - синтаксис мене бентежить, також, мабуть, ви не можете розкладати завдання на місяць

  • порядок денний - здається найбільш перспективним, проте я заплутаний у функціональності бази даних

  • часовий план - занадто простий, не може запускатися та зупинятися

Я вважаю синтаксис останнього заплутаним.


1
Як щодо того, що просто використовувати setInterval, схоже саме на те, що ви шукаєте?
adeneo

Так, чому б не використовувати setInterval?
Yalamber

Я знаю, що під кришкою деякі з цих програм використовують setInterval, але я шукав щось трохи вищого рівня ... Я звик використовувати графік ( github.com/dbader/schedule ) у python, і я шукав вузол аналог тому
user379468

Спробуйте TaskTimer - github.com/onury/tasktimer
Onur Yıldırım

Я використав порядок денний, непогано
Олександр Головатий

Відповіді:


223

Я б рекомендував node-cron. Це дозволяє виконувати завдання, використовуючи шаблони Cron, наприклад

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

Але також і більш складні графіки, наприклад

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

Приклад коду : виконання роботи кожні 10 хвилин:

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

Ви можете знайти більше прикладів у вікі -вузлах cron

Детальніше про конфігурацію cron можна дізнатися на cron wiki

Я використовую цю бібліотеку у багатьох проектах, і це робить свою роботу. Я сподіваюся, що це допоможе.


добре, мене
залякав

1
зачекайте, я скоро поговорив, як би я написав крон, який працює кожні 5 секунд або кожні 30 секунд?
користувач379468

3
синтаксис cron може виглядати страшно . З іншого боку, він існує тривалий час і широко відомий, тому отримає багато підтримки на SO
Tom

1
Просто оновив свій відповідь , так що це буде - '* / 5 * * * * * - кожні 5 секунд або' * / 30 * * * * * 'секунд
Tom

1
Станом на 2020 рік та відповідно до офіційної сторінки npm -cron npm, використання цього пакету зменшилось. Цей пакет востаннє був опублікований в npm 2 роки тому, тому він регулярно не оновлюється. Тепер слід віддавати перевагу іншому пакетному вузлу-cron, який, мабуть, має те саме ім'я, але має різні URL-адреси.
n0noob

36

Я використав node-cron і порядок денний .

node-cron - це дуже проста бібліотека, яка забезпечує дуже основні та легкі для розуміння такі форми, як crontab. Він не потребує ніяких конфігурацій і просто працює.

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

порядок денний дуже потужний і підходить для набагато складніших послуг. Подумайте про ifttt , вам доведеться виконати мільйони завдань. порядок денний був би найкращим вибором.

Примітка. Щоб використовувати Порядок денний, вам потрібен Mongodb

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

1
чомусь під час спроби використовувати Agenda я отримую помилку ReferenceError: Порядок денний не визначений. Я встановив пакет з NPM, чи потрібно щось робити перед тим, як скласти порядок денний?
користувач379468

2
я думаю, вам доведеться вимагати його до вашої локальної змінної. var Agenda = вимагати ("Порядок денний");
Райан Ву

1
Нещодавно я написав коментар у блозі щодо порядку денного, налаштування проекту та структури проекту goo.gl/5sCNBM
Робін Вірух

1
Зауважте, що для використання програми "Порядок денний" вам потрібен Mongodb
Марк Робсон,

1
Чи породжує node-cron або порядок денний окремий системний процес вузла? Чи можете ви використовувати їх у налаштуваннях процесу у багатьох вузлах?
Прасад Сільва

14

Я думаю, що найкращий рейтинг

1. вузол-графік

2.пізніше

3.кронтаб

а зразок розкладу вузлів знаходиться нижче:

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

Можливо, ви можете знайти відповідь з модулів вузлів .


1
Любіть синтаксис, дякую за спільний доступ
Overdrivr

10

Я написав модуль вузла, який забезпечує обгортку навколо setInterval, використовуючи тривалість моменту, що забезпечує декларативний інтерфейс:

npm встановлювати кожну мить

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 (404)
kekko12

це значно читабельно. Я написав пакет, який використовує node-cronяк відповідь @Tom. і має приємний синтаксис, подібний до вашого. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93



1

Я написав невеликий модуль, щоб зробити саме це, званий timexe :

  • Його простий, невеликий надійний код і не має залежностей
  • Роздільна здатність знаходиться в мілісекундах і має високу точність у часі
  • Cron, але не сумісний (зворотний порядок та інші удосконалення)
  • Я працюю і в браузері

Встановити:

npm install timexe

використання:

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

ви можете досягти функцій запуску / зупинки, видаливши / повторно додавши запис безпосередньо в масив завдань timexe. Але це не експресна функція.


4
Ви повинні згадати, що ви автор.
a20

13
@ a20 "написали невеликий модуль, щоб зробити саме це". Це означає, що він є автором у випадку, якщо ви пропустили під час читання
PirateApp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.