O scheduler2 é um bitcode de agendamento para o thrustjs.
Por causa da nova versão do thrust que é executado com a GraalVM; o scheduler2 trabalha com uma configuração de script a ser agendado; logo, cada script de uma tarefa agendada é executado em um contexto JavaScript separado de sua aplicação principal.
Utilize o tpm para instalar este bitcode:
tpm install scheduler2Inicie o scheduler2 informando a quantidade de suas treads. A biblioteca contém a função .initScheduler() a qual deve ser chamada no máximo uma vez em seu código.
Por exemplo:
const scheduler = require('scheduler2')
scheduler.initScheduler()Neste exemplo, o pool de threads está sendo iniciado com 4 threads. E aqui:
const scheduler = require('scheduler2')
scheduler.initScheduler(1,5)Nós estamos iniciando o agendador com no mínimo 1 thread; e, e durante a execução das tarefas este pool irá crescer com até 5 threads.
O agendador possui a seguinte função de agendamento:
schedule(taskScript, time, now)O primeiro parâmetro taskScript identifica o script que irá executar a tarefa a ser agendada. Seu caminho pode ser absoluto ou relativo ao diretório raiz da aplicação.
O segundo parâmetro time refere-se ao tempo em que o script taskScript será executado periodicamente.
E o terceiro parâmetro, identificar se o script deverá ser executado de imediato; antes de o tempo previsto ocorrer.
Lembre-se que cada agendamento é executado pelo scheduler2 em um contexto/thread separado.
Se para o parâmetro time, você informar um valor numérico inteiro; então, o agendador entende que estamos agendando uma tarefa para ser executada continuamente, sempre a cada um período de milissegundos.
Segue um exemplo:
const scheduler = require('scheduler2')
scheduler.schedule('src/tasks/task01.js', 360000)Acima, estamos informando ao agendador que a tarefa contida no script "src/tasks/task01.js" estará sendo executada a cada 6 minutos (360000 milissegundos). E neste exemplo:
const scheduler = require('scheduler2')
scheduler.schedule('src/tasks/task01.js', 360000, true)Temos a mesma configuração e com a diferença: o parâmetro now está definido como true. Isto significa que a tarefa do script primeiro será executada por agora; e, depois o agendador irá executá-la a cada 6 minutos.
Caso o parâmetro time for um array de strings; neste caso, o agendador entenderá que a tarefa deverá ser executada periodicamente na hora que foi informada.
Vejamos o exemplo a seguir para entender as várias possibilidades de agendar por hora:
const scheduler = require('scheduler2')
// Agendamento 01
scheduler.schedule('src/tasks/task02.js', ['8'])
// Agendamento 02
scheduler.schedule('src/tasks/task03.js', ['9:15'])
// Agendamento 03
scheduler.schedule('src/tasks/task04.js', ['10:20:45'])
// Agendamento 04
scheduler.schedule('src/tasks/task05.js', ['9:20', '14:33'])Estamos informando para o agendador, o seguinte:
- O agendamento 01: Todo dia, às 08:00, o agendador irá executar a tarefa do script
scr/tasks/task02.js. - O agendamento 02: Todo dia, às 09:15, o agendador irá executar a tarefa do script
scr/tasks/task03.js. - O agendamento 03: Todo dia, às 10:20:45, o agendador irá executar a tarefa do script
scr/tasks/task04.js. - O agendamento 04: Todo dia, tanto às 09:20 e como às 14:33, o agendador irá executar a tarefa do script
scr/tasks/task05.js.
O arquivo JavaScript que contém a tarefa deverá exportar uma função diretamente, ou uma função com o nome task.
Por exemplo, se agendarmos:
const scheduler = require('scheduler2')
scheduler.schedule('src/tasks/task07.js', ['23:59:59'], true)Então, o arquivo task07 deve exportar uma função assim:
// Arquivo task07.js ...
exports = (schedulerTask) => {
console.log('Faça algo durante a sua execução')
}ou, assim:
// Arquivo task07.js ...
exports = {
task: (schedulerTask) => {
console.log('Faço alguma coisa por você ;-)')
}
}Quanto à função exportada, o seu parâmetro de entrada schedulerTask é um
objeto que contém o método/função cancel(), que é utilizado para cancelar a continuidade do agendador de executar a tarefa.
Veja o exemplo task02.js:
const resource = {
count: 5
}
exports = (schedulerTask) => {
console.log(`Task 02 - Count: ${resource.count}`)
--resource.count
if (!resource.count) {
schedulerTask.cancel()
}
}Aqui vemos um caso em que uma tarefa é executada umas 5 vezes; e depois disto,
informamos ao agendador que a tarefa poderá ser removida de sua lista de execução, por chamarmos a função schedulerTask.cancel(). Logo, a tarefa deste script não será mais executada pelo agendador; podendo outra tarefa ser agendada em seu lugar.