index.js 1.92 KB
/**
 * Created by lintry on 18/12/20.
 */
"use strict";
/**
 * 定时器定义
 */
const fs = require('fs-extra'),
    path = require('path'),
    cron = require('node-cron'),
    moment = require('moment'),
    SCHEDULE = require('../init/config').schedule,
    Result = require('kml-express-stage-lib').Result,
    logger = require('../init/log4js-init').cron;
const TTL = global.config.cache.ttl.CRON_LOCK;
const lockKey = require('../modules/lockKey');
const {sequelize, po} = global;
const id_worker = require('../modules/id_worker');

module.exports = function () {
    let task_list = [];

    // 遍历配置的定时器
    Object.keys(SCHEDULE).forEach(cron_id => {
        let cfg = SCHEDULE[cron_id];

        if (cfg.enable && fs.existsSync(path.resolve(__dirname, cron_id + '.js'))) {
            // 以键值在当前目录下加载异步执行模块
            const async_runner = require('./' + cron_id);
            if (!async_runner) {
                logger.error(`没有找到可以执行的模块`, cfg.name);
                return;
            }
            if (!cron.validate(cfg.cron)) {
                logger.error('定时器的时间定义错误', cfg.cron);
                return;
            }
            logger.info('开启定时器', cfg.name, cfg.cron);
            task_list.push(cron.schedule(cfg.cron, async function () {
                let result = await lockKey.lockKey(`cron:${cron_id}`, TTL);
                if (result.locked) {

                    let result;
                    try {
                        result = await async_runner(cfg);
                    } catch (e) {
                        result = Result.Error(e.message); // 记录执行的错误
                    }

                    logger.info(moment().format('YYYY-MM-DD HH:mm:ss'), `${cfg.name} logger =>`, result.ret, result.msg, result.content);

                }
            }, {scheduled: false}));
        }
    });

    return task_list;
};