ノードの複数のcronジョブの管理JSプロジェクト
49764 ワード
どのようなcronジョブですか?
cronジョブは、特定の間隔または特定の時間で取得するコードやアクションの一部です.いくつかの例は
ノードのcron仕事。タイプスクリプト.
複数のパッケージを使用してノードのcronジョブを作成できます.しかし、我々はnode-cronで働きます.
import cron from 'node-cron'
const cronExpression = '* * * * * *';
function action(){
console.log('This cron job will run every second')
}
const job = cron.schedule(cronExpression, action, {scheduled:false})
job.start()//starts the job
//job.stop() //stops the job
cronexpressionは、アクションがどの程度呼び出されるかを記述します.cronexpressionの説明のためにチェックhere.問題
cronジョブを一時停止したり再起動したりする場合があります.それから、我々はそれを管理する方法を見つける必要があります.私たちの急行サーバーで言う私たちはcronの仕事を開始または停止する方法を望んでいた.どうやってやるの?
import cron from 'node-cron'
import express, { Request, Response } from 'express'
const cronExpression = '* * * * * *';
function action(){
console.log('This cron job will run every second')
}
const job = cron.schedule(cronExpression, action, {scheduled:false})
const app = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.post('/start-job',(req:Request,res:Response)=>{
job.start();
res.status(200).json({message:'job started successfully'})
})
app.post('/stop-job',(req:Request,res:Response)=>{
job.stop();
res.status(200).json({message:'job stopped successfully'})
})
ほんの数人の仕事で働くとき、我々はこうすることができました.しかし、私たちは多くの仕事をしていると言います、そして、私たちはそれらのすべてのために終点を作成したくありません.
アプローチはそれぞれの仕事をユニークなキーに関連づけることです、そして、我々は鍵を仕事に写像することができました.
以下の実装を見てください.
import cron from 'node-cron'
import express, { Request, Response } from 'express'
//hash map to map keys to jobs
const jobMap: Map<string, cron.ScheduledTask> = new Map();
//jobs
const metricsJob = cron.schedule('0 0 0 1 * *',()=>{
console.log('There are 5 users in the application')
}, {scheduled:false})
const birthdayJob = cron.schedule('0 0 0 * * *',()=>{
console.log('20 users have their birthday today')
}, {scheduled:false})
//set the key to map to the job
jobMap.set('metrics',metricsJob)
jobMap.set('birthday',birthdayJob)
//express api and simple routes
const app = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.post('/start-job',(req:Request,res:Response)=>{
const {jobName} = req.body
const job = jobMap.get(jobName)
if(!job) return res.status(400).json({message: 'invalid job name'})
else job.start()
res.status(200).json({message:`job ${jobName} started successfully`})
})
app.post('/stop-job',(req:Request,res:Response)=>{
const {jobName} = req.body
const job = jobMap.get(jobName)
if(!job) return res.status(400).json({message: 'invalid job name'})
else job.start()
res.status(200).json({message:`job ${jobName} stoppeed successfully`})
})
それは正しく動作します.すべて良いと良い.別のユースケースは、関連するジョブを開始または停止したい場合です.あなたが認証に関連した2つの仕事とアプリケーションメトリックに関連した2つの仕事を持っていると言います.個々のジョブを個別に開始することなく、AuthまたはMetaicsの下ですべてのジョブを開始または停止する方法が必要です.
あなたも、これを達成するために別のマップを使用することができます.
以下の実装を見てください.
import cron from 'node-cron'
import express, { Request, Response } from 'express'
//hash map to map keys to jobs
const jobMap: Map<string, cron.ScheduledTask> = new Map();
const jobGroupsMap: Map<string, cron.ScheduledTask[]> = new Map();
//jobs
//default jobs
const metricsJob = cron.schedule('0 0 0 1 * *',()=>{
console.log('There are 5 users in the application')
}, {scheduled:false})
const birthdayJob = cron.schedule('0 0 0 * * *',()=>{
console.log('20 users have their birthday today')
}, {scheduled:false})
// jobs related to auth
const countLoggedInUsersJob = cron.schedule('0 * * * * *',()=>{
console.log('There are 100 users currently logged in')
}, {scheduled:false})
const autoUnbanUsersJob = cron.schedule('0 0 * * * *',()=>{
console.log('unbanning users whose ban has expired')
},{scheduled:false})
//set the key to map to the job
jobMap.set('metrics',metricsJob)
jobMap.set('birthday',birthdayJob)
jobMap.set('countUsers',countLoggedInUsersJob)
jobMap.set('unbanUsers',autoUnbanUsersJob)
jobGroupsMap.set('default',[metricsJob, birthdayJob])
jobGroupsMap.set('auth',[countLoggedInUsersJob, autoUnbanUsersJob])
//express api and simple routes
const app = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.post('/start-job',(req:Request,res:Response)=>{
const {jobName} = req.body
const job = jobMap.get(jobName)
if(!job) return res.status(400).json({message: 'invalid job name'})
else job.start()
res.status(200).json({message:`job ${jobName} started successfully`})
})
app.post('/stop-job',(req:Request,res:Response)=>{
const {jobName} = req.body
const job = jobMap.get(jobName)
if(!job) return res.status(400).json({message: 'invalid job name'})
else job.start()
res.status(200).json({message:`job ${jobName} stoppeed successfully`})
})
app.post('/start-job-group',(req:Request,res:Response)=>{
const {groupName} = req.body
const jobs = jobGroupsMap.get(groupName)
if(!jobs) return res.status(400).json({message: 'invalid group name'})
else{
jobs.forEach(job=>{
job.start()
})
}
res.status(200).json({message:`jobs in group ${groupName} started successfully`})
})
app.post('/stop-job-group',(req:Request,res:Response)=>{
const {groupName} = req.body
const jobs = jobGroupsMap.get(groupName)
if(!jobs) return res.status(400).json({message: 'invalid group name'})
else{
jobs.forEach(job=>{
job.stop()
})
}
res.status(200).json({message:`jobs in group ${groupName} stopped successfully`})
})
提案解
ご覧のように、ノードで複数のcronジョブを処理します.ユーザーが作成するそれぞれの新しいcronジョブを満たすコードを書く必要があるので、JSは面倒になることができました.
この問題を解決するために、パッケージを作成しました.@ose4g/cron-manager .
上記のすべてのユースケースをカバーします
特定のジョブ
npm i @ose4g/cron-manager
または、あなたが糸を使っているならばyarn add @ose4g/cron-manager
以下の実装を参照くださいimport { cronGroup, cronJob, CronManager } from "@ose4g/cron-manager";
import express, { Request, Response } from 'express'
@cronGroup('default')
class DefaultJobs{
@cronJob('0 0 0 1 * *','metrics')
metricsCount(){
console.log('There are 5 users in the application')
}
@cronJob('0 0 0 * * *','birthday')
countBirthdays(){
console.log('20 users have their birthday today')
}
}
@cronGroup('auth')
class AuthJobs{
@cronJob('0 * * * * *','countUsers')
countLoggedInUsers(){
console.log('There are 100 users currently logged in')
}
@cronJob('0 0 * * * *','unbanUsers')
autoUnbanUsers(){
}
}
const cronManager = new CronManager()
//registers the jobs
cronManager.register(DefaultJobs, new DefaultJobs())
cronManager.register(AuthJobs, new AuthJobs())
//express api and simple routes
const app = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.post('/start-job',(req:Request,res:Response)=>{
const {jobName} = req.body
try {
cronManager.startHandler(jobName) //throw error for invalid jobName.
res.status(200).json({message:`job ${jobName} started successfully`})
} catch (error) {
return res.status(400).json({message: 'invalid job name'})
}
})
app.post('/stop-job',(req:Request,res:Response)=>{
const {jobName} = req.body
try {
cronManager.stopHandler(jobName) //throw error for invalid jobName.
res.status(200).json({message:`job ${jobName} stopped successfully`})
} catch (error) {
return res.status(400).json({message: 'invalid job name'})
}
})
app.post('/start-job-group',(req:Request,res:Response)=>{
const {groupName} = req.body
try {
cronManager.stopHandler(groupName) //throw error for invalid jobName.
res.status(200).json({message:`jobs in group ${groupName} started successfully`})
} catch (error) {
return res.status(400).json({message: 'invalid group name'})
}
})
app.post('/stop-job-group',(req:Request,res:Response)=>{
const {groupName} = req.body
try {
cronManager.stopHandler(groupName) //throw error for invalid jobName.
res.status(200).json({message:`jobs in group ${groupName} stopped successfully`})
} catch (error) {
return res.status(400).json({message: 'invalid group name'})
}
})
app.post('/start-all',(req:Request, res:Response)=>{
cronManager.startAll();
return res.status(200).json({message: 'successfully started all jobs'})
})
app.post('/stop-all', (req:Request, res:Response)=>{
cronManager.stopAll();
return res.status(200).json({message: 'successfully stopped all jobs'})
})
だからパッケージを使用するには、最初に行う必要がいくつかあります.TSconfigで以下を確認してください.JSONファイル
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
startall () :アプリケーションで定義されているすべてのジョブを開始します.
stopall () :アプリケーションで定義されているすべてのジョブを停止します.
StartHandler ( JobName ): JobNameで特定のジョブを開始します.
stophandler ( JobName ): JobName
StartGroup ( GroupName ):グループ名の下のすべてのジョブをグループ名
StartGroup(groupName):グループ名のグループ内のすべてのジョブを開始します.
getGroups ():アプリケーション
gethandlers ():アプリケーション
このパッケージを使用すると、cronジョブのロジックに集中でき、cronジョブを管理するためのコードが少なくなります.
パッケージhereのソースコードをチェックしてください.親切にも星を残す🙏🏾🙏🏾.
私はあなたがこの記事洞察力と有用性を発見願っています.
次の人に会いなさい.滞在する
Reference
この問題について(ノードの複数のcronジョブの管理JSプロジェクト), 我々は、より多くの情報をここで見つけました https://dev.to/ose4g/managing-multiple-cron-jobs-in-nodejs-project-2b4hテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol