Do sada sam objavio nekoliko članaka korištenju NodeJS API-ja i svaki od njih ima istu poveznicu, a to je činjenica da se izvršavaju isključivo kada ih pozovem. U većini slučajeva to tako treba biti, ali postoje i slučajevi u kojima želim da se određeni zadatak izvrši bez da ga ručno moram pokrenuti pozivajući neki API endpoint. U tome će mi pomoći Cron Job.
Postavljanje projekta
Kreiram mapu naziva ExpressNodeCron i unutar nje pokrećem naredbu:
1 |
$ npm init --yes |
Odmah nakon toga instaliram Express.js i Node Cron pakete:
1 2 |
$ npm install express --save $ npm install node-cron --save |
Sada u mapi projekta mogu vidjeti datoteku package.json koja je osnova ovog projekta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "name": "expressnodecron", "version": "1.0.0", "description": "ExpressJS Cron exaple", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Tomislav Stanković", "license": "ISC", "dependencies": { "node-cron": "^1.2.1", "express": "^4.16.3" } } |
Kreiranje API-ja
Unutar datoteke index.js koju sam upravo kreirao kopiram sljedeći sadržaj:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var express = require('express'); var app = express(); var cron = require("node-cron"); var port = process.env.PORT || 8080; var apiRoutes = express.Router(); apiRoutes.get('/', function(req, res) { //ako je sve ispravno postavljeno kao odgovor dobijem ovu poruku res.json({ message: 'API radi!' }); }); app.use('/api', apiRoutes); app.listen(port); console.log('API je pokrenut na portu:' + ' ' + port); |
API odmah testiram na putanji http://localhost:8080/api/
Cron Job funkcionalnost
Sada pratim dostupnu dokumentaciju na adresi https://www.npmjs.com/package/node-cron
Na sljedećem primjeru nalazi se osnova cron job funkcionalnosti.
1 2 3 |
cron.schedule("* * * * *", function() { console.log("izvršavanje zadatka svake minute"); }); |
Na liniji 1 nalazi se "* * * * *" što označava odabrani interval u kojemu će se određeni zadatak izvršiti.
1 2 3 4 5 6 7 8 9 |
# ┌────────────── sekunde (opcionalno), vrijednost: 0 - 59 # │ ┌──────────── minute, vrijednost: 0-59 # │ │ ┌────────── sati, vrijednost: 0-23 # │ │ │ ┌──────── dan u mjesecu, vrijednost: 1-31 # │ │ │ │ ┌────── mjesec, vrijednost: 1-12 (ili nazivi) # │ │ │ │ │ ┌──── dan u tjednu, vrijednost: 0-7 (ili nazivi, 0 ili 7 označava nedjelju) # │ │ │ │ │ │ # │ │ │ │ │ │ # * * * * * * |
Na liniji 2 nalazi se zadatak koji će se izvršiti u zadanom intervalu.
Osim ranije spomenutog intervala moguće su i sljedeće kombinacije:
– više vrijednosti odvojenih zarezom
1 2 3 |
cron.schedule('1,2,4,5 * * * *', function(){ console.log('izvršavanje nakon 1, 2, 4 i 5 minuta'); }); |
– korištenje raspona vrijednosti
1 2 3 |
cron.schedule('1-5 * * * *', function(){ console.log('izvršavanje zadatka od 1. do 5. minute'); }); |
– izvršavanje u koracima
1 2 3 |
cron.schedule('*/2 * * * *', function(){ console.log('izvršavanje zadataka svake dvije minute'); }); |
– korištenje naziva mjeseca i dana umjesto brojeva (moraju biti na engleskom jeziku)
1 2 3 |
cron.schedule('* * * August Sunday', function(){ console.log('izvršavanje svake nedjelje u osmom mjesecu'); }); |
Svi ranije navedeni zadaci pokreću se prilikom startanja NodeJS servera, ali postoje još i dodatne metode pomoću kojih je moguće u određenom trenutku pokrenuti neki Cron Job, stopirati ga ili skroz ugasiti.
Start task.start();
1 2 3 4 5 6 7 |
var cron = require('node-cron'); var task = cron.schedule('* * * * *', function() { console.log('pokrenuto izvršavanje zadatka'); }, false); task.start(); |
Stop task.stop();
Jednom stopirati zadatak moguće je ponovno pokrenuti.
1 2 3 4 5 6 7 |
var cron = require('node-cron'); var task = cron.schedule('* * * * *', function() { console.log('izvršava se svake minute do stopiranja'); }); task.stop(); |
Primjer:
Pozivanjem putanje http://localhost:8080/api/stopiraj zaustavljam Cron Job.
1 2 3 4 5 6 7 8 |
var task = cron.schedule("* * * * *", function() { console.log("izvršavanje zadatka svake minute", new Date()); }); apiRoutes.get('/stopiraj', function(req, res) { task.stop(); res.json({ message: 'Zadatak zaustavljen!' }); }); |
Destroy task.destroy();
Jednom prekinuti zadatak nije moguće ponovno pokrenuti.
1 2 3 4 5 6 7 |
var cron = require('node-cron'); var task = cron.schedule('* * * * *', function() { console.log('neće se više izvršavati, niti ga je moguće ponovno pokrenuti'); }); task.destroy(); |