Eu preciso de um agendador Nodejs que permita tarefas em diferentes intervalos [fechado]

127

Estou procurando um agendamento de tarefas do nó que permita agendar várias tarefas em intervalos diferentes. Por exemplo,

  • chame a função A a cada 30 segundos
  • chame a função B a cada 60 segundos
  • chame a função C a cada 7 dias

Eu também quero poder iniciar e parar o processo.

Até agora, eu olhei para:

  • mais tarde - a sintaxe me confunde, também aparentemente você não pode agendar tarefas além de um mês

  • agenda - parece a mais promissora, no entanto, estou confuso sobre a funcionalidade do banco de dados

  • plano de tempo - simples demais, não é possível iniciar e parar

Acho a sintaxe do último confusa.

user379468
fonte
1
Que tal usar apenas um setInterval, parece exatamente o que você procura?
adeneo
Sim, por que não usar setInterval?
Yalamber
Eu sei que alguns deles usam setInterval, mas eu estava procurando por algo um pouco mais alto ... Eu costumava usar o schedule ( github.com/dbader/schedule ) em python, e estava procurando por um nó análogo a isso
user379468
Tente TaskTimer - github.com/onury/tasktimer
Onur Yıldırım
Eu usei agenda, não é ruim #
Aleksandr Golovatyi

Respostas:

223

Eu recomendaria node-cron. Permite executar tarefas usando padrões Cron, por exemplo

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

Mas também horários mais complexos, por exemplo

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

Código de exemplo : executando o trabalho a cada 10 minutos:

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

Você pode encontrar mais exemplos no wiki node-cron

Mais informações sobre a configuração do cron podem ser encontradas no wiki do cron

Eu tenho usado essa biblioteca em muitos projetos e ele faz o trabalho. Espero que ajude.

Tom
fonte
ok, eu estava intimidado pela sintaxe cron, mas esta parece ser a melhor abordagem
user379468
1
espere com quem falei em breve, como escreveria um cron que é executado a cada 5 segundos ou a cada 30 segundos?
user379468
3
a sintaxe cron pode parecer assustadora . Por outro lado, existe por um longo tempo e é amplamente conhecido, portanto, obterá muito suporte no SO #
Tom
1
Apenas atualizei minha resposta para que fosse - '* / 5 * * * * *' - a cada 5 segundos ou '* / 30 * * * * *' segundos
Tom
1
A partir do ano 2020, e de acordo com a página oficial npm do node-cron , o uso deste pacote diminuiu. Este pacote foi publicado pela última vez no npm há 2 anos, portanto, não é atualizado regularmente. Agora, outro pacote node-cron, que aparentemente tem o mesmo nome, mas usa URL diferente, deve ser preferido.
n0noob 5/07
36

Eu usei node-cron e agenda .

O node-cron é uma biblioteca muito simples, que fornece APIs muito básicas e fáceis de entender, como o crontab. Ele não precisa de nenhuma configuração e simplesmente funciona.

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

agenda é muito poderosa e adequada para serviços muito mais complexos. Pense no ifttt , você precisa executar milhões de tarefas. agenda seria a melhor escolha.

Nota: Você precisa do Mongodb para usar a 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
fonte
1
por algum motivo, quando tento usar a Agenda, recebo um erro ReferenceError: a Agenda não está definida. Eu instalei o pacote com o NPM, tenho que fazer alguma coisa antes de instanciar a agenda?
user379468
2
Eu acho que você precisa exigi-lo para sua variável local. var Agenda = require ("Agenda");
Ryan Wu
1
Recentemente, escreveu um comentário no blog sobre a agenda, a configuração do projeto e estrutura do projeto goo.gl/5sCNBM
Robin Wieruch
1
Note que você precisa MongoDB correndo para usar Agenda
Mark Robson
1
O node-cron ou a agenda geram um processo separado do sistema do nó? Você pode usá-los em uma configuração de processo de vários nós?
Prasad Silva
14

Eu acho que o melhor ranking é

1.node-schedule

2.mais tarde

3.crontab

e a amostra de agendamento de está abaixo:

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

Talvez você possa encontrar a resposta nos módulos do .

Richard Xue
fonte
1
Amo a sintaxe, obrigado por compartilhar
Overdrivr
10

Eu escrevi um módulo de nó que fornece um wrapper em torno de setInterval usando durações de momento fornecendo uma interface declarativa:

npm instalar a todo momento

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
fonte
4
O link github está quebrado (404)
kekko12
isso é muito legível. Eu escrevi um pacote que usa node-croncomo resposta @ Tom. e tem uma boa sintaxe semelhante à sua. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93 #
@ kekko12 Há no NPM: npmjs.com/package/every-moment
Ali Hesari
1

Eu escrevi um pequeno módulo para fazer exatamente isso, chamado timexe :

  • Seu código simples, pequeno e confiável e não possui dependências
  • A resolução é em milissegundos e tem alta precisão ao longo do tempo
  • Cron like, mas não compatível (ordem invertida e outras melhorias)
  • Eu também trabalho no navegador

Instalar:

npm install timexe

usar:

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

você pode obter a funcionalidade iniciar / parar removendo / adicionando novamente a entrada diretamente na matriz de tarefas timexe. Mas não é uma função expressa.

Simon Rigét
fonte
4
Você deve mencionar que é o autor.
a20
13
@ a20 "escrevi um pequeno módulo para fazer exatamente isso" significa que ele é o autor no caso de você ignorado durante a leitura
PirateApp