在 Node.js 中实现作业调度程序
在本文中,我们将了解什么是作业调度程序以及如何在 Node.js 中实现作业调度程序。在 Node.js 中实现作业调度程序
最近有一篇关于 Nodejs 的文章,
使用 webRTC 和 Node.js 构建 P2P 视频聊天应用程序
通过用例理解 Node.js 中的 EventEmitter
您是否曾经好奇过,应用服务器如何在不发生任何物理中断的情况下定期备份文件?这就是 Cron 作业的作用所在。
Cron Jobs 定期安排一项作业来执行配置的操作。
有几个用例需要 cron 任务发挥重要作用。它们是:
- 删除日志文件- 应用程序生成大量日志。清除旧日志将节省服务器中的大量空间。可以使用 cron 作业来完成。
- 数据库备份- 数据库备份可防止应用程序遭受灾难。Cron 作业将有助于实现这一点。
- 应用程序逻辑- 我们可以使用 cron 作业根据时间执行一些应用程序逻辑。
cron 作业如何工作
我们将编写一个 cron 作业来在生产应用程序中存档数据库中的旧记录。
首先,创建一个项目并安装以下依赖项,
npm init --yes
npm install express node-cron mongoose faker
- express - Node.js 中的 Web 服务器库
- node-cron - nodejs 中的 cron 作业调度程序库
- mongoose - MongoDB 的 ORM
之后,创建一个名为Model.js的文件并添加以下代码
const mongoose = require('mongoose');
const weatherSchema = new mongoose.Schema({
minTemp : {
type: Number
},
maxTemp : {
type : Number
},
recordedDate : {
type : Date
},
isArchived : {
type : Boolean,
default : false
}
});
class Weather {
static getRec(date) {
return this.find({
recordedDate : {
'$lte' :new Date(date)
}
}).exec();
}
static insertBulkData(data){
return this.insertMany(data);
}
static archiveData(date){
return this.updateMany({
recordedDate : {
'$lte' :new Date(date)
}
},{
$set : {
isArchived : true
}
}).exec();
}
static getArchivedData(){
return this.find({
isArchived : true
}).exec();
}
}
weatherSchema.loadClass(Weather);
module.exports = mongoose.model('Weather',weatherSchema)
主要是,Model.js为数据库中存储天气数据的 DB 表创建了一个 mongoose 模式。
之后,创建一个名为scheduler.js的文件并添加作业调度程序的代码。
cron.schedule("* * * * * *",() => {
console.log("Running every minute");
})
cron Schedule 按照提到的时间格式安排作业。
要了解有关 cron 作业格式的更多信息,有一个很棒的网站crontab-guru,其中有详细的解释
将 mongoose 与 Express 连接起来,向数据库插入一些虚拟数据。
const cron = require('node-cron');
const express = require('express');
const mongoose = require('mongoose');
const app = express();
const faker = require('faker');
const model = require('./Model');
mongoose.connect('mongodb://localhost:27017/nodescheduler').then((res) => {
console.log('mongoose connected successfully');
app.get("/insertdata",async (req,res) => {
let data = [];
for(let i=0;i < 100;i++){
let record = {
minTemp: faker.random.number(),
maxTemp : faker.random.number(),
recordedDate : faker.date.past()
}
data.push(record);
}
await model.insertBulkData(data);
res.send("Data is inserted");
})
app.listen(4000,() => {
console.log("Server is running port 4000");
})
})
.catch((err) => {
console.error(err);
})
要使用fakerjs插入一些虚拟数据,请使用以下命令运行脚本,然后访问 URL http://localhost:4000/insertdata
node scheduler.js
它将创建一些批量虚拟数据来测试作业调度程序。现在是时候添加作业调度程序了。
cron.schedule("* * * * */3 *",async() => {
var d = new Date();
d.setMonth(d.getMonth() - 2); //1 month ago
await model.archiveData(d);
console.log("scheduler => archived");
})
上述 cron 作业将每 3 个月运行一次,以将数据标记为已在数据库中存档。
同样,我们可以使用 cron 作业来为我们的应用程序逻辑安排作业。
概括
最重要的是,cron 作业在某些应用程序开发用例中发挥着至关重要的作用。了解 cron 作业在应用程序开发中的工作原理总是有好处的。
如果你想以最小的努力实现生产级标准的作业调度程序,我建议你查看bree
文章来源:https://dev.to/ganeshmani/implementing-job-schedulers-in-node-js-j2f