ノードの複数のcronジョブの管理JSプロジェクト


どのようなcronジョブですか?


cronジョブは、特定の間隔または特定の時間で取得するコードやアクションの一部です.いくつかの例は
  • あなたのアプリを一度毎日、その誕生日は、その日のメールを送信するユーザーのためのメールをチェックします.
  • は毎月の1月にあなたのアプリの統計/メトリックを取って、データベースに格納したり、管理者にデータを送信します.
  • 基本的にあなたが様々な間隔で取りたいアクションはcron jobと呼ばれます

    ノードの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ファイル
    TSconfigで以下を確認してください.JSONファイル
  •   "experimentalDecorators": true,
      "emitDecoratorMetadata": true,
    
  • あなたのジョブクラスを作成し、@ crongroupsタグで注釈を付けます.これはジョブのグループ名の文字列である単一のパラメータをとります.
  • クラス内のメソッドを作成し、@ cronjob ()で必須メソッドを注釈します.これは2つのパラメータがかかります.一つ目はcron式ですが、2番目はJobNameです.
  • cronmanagerのインスタンスを作成し、各ジョブクラスのインスタンスをcronManagerに登録します.クラスが登録されておらず、ジョブを実行しようとするとエラーが発生します.
  • ジョブの開始または停止.以下の関数が利用可能です

  • startall () :アプリケーションで定義されているすべてのジョブを開始します.

  • stopall () :アプリケーションで定義されているすべてのジョブを停止します.

  • StartHandler ( JobName ): JobNameで特定のジョブを開始します.

  • stophandler ( JobName ): JobName
  • で特定のジョブを停止します.

  • StartGroup ( GroupName ):グループ名の下のすべてのジョブをグループ名
  • で開始する

  • StartGroup(groupName):グループ名のグループ内のすべてのジョブを開始します.

  • getGroups ():アプリケーション
  • のすべてのグループ名を一覧表示する

  • gethandlers ():アプリケーション
  • のすべてのハンドラ名を一覧表示する
    このパッケージを使用すると、cronジョブのロジックに集中でき、cronジョブを管理するためのコードが少なくなります.
    パッケージhereのソースコードをチェックしてください.親切にも星を残す🙏🏾🙏🏾.
    私はあなたがこの記事洞察力と有用性を発見願っています.
    次の人に会いなさい.滞在する