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.


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


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.


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

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 nó 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 nó .


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


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 #



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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.