Files
vic-server-mongo/src/jobs/jobs.js
chaosBreaking 230c77394e job touch
2019-10-19 17:23:19 +08:00

116 lines
3.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
/**
* 为何要把分属于不同业务模块的job集中到此处
* 如果后续要把任务执行与web服务器分离就会很方便就算不分离也没多大坏处。
* 任务包括:
* transaction : {
* 1. 每小时去清理指定startTime的地产
* {
* status: -> 1,
* price: -> price * (1 + profit),
* currentOwner -> ''
* }
* 2. 将currentOwner对应的用户的asset.log加上a
* }
*/
const mongoose = require('mongoose');
const Fund = require('../modules/fund/fund.model');
const exec = require('child_process').exec;
async function confirm (job = mock, done = mock) {
mylog.info('[Schedule Job] 矿晶确认程序开始执行......');
const unconfirmed = await Fund.find({
'fundList.status': 0
});
mylog.info('共有' + unconfirmed.length + '用户需要确认');
unconfirmed.forEach(async (fund) => {
const len = fund.fundList.length || 0;
let acc = 0;
for (let i = 0; i < len; ++i) {
const fundItem = fund.fundList[i];
if (fundItem && fundItem.status === 0) {
++acc;
await Fund.findByIdAndUpdate(fund.id, {
$set: {
[`fundList.${i}.status`]: 1 // 确认激活
}
});
}
}
mylog.info(`用户${fund.userId} 共更新${acc}`);
job.touch();
});
return typeof done === 'function' && done('矿晶确认完成');
}
async function mineJob (job = mock, done = mock) {
const rl = exec('node ./src/jobs/mine.js');
rl.stderr.on('data', function (data) {
mylog.error('[mine]定时任务出错\n');
mylog.error(data);
});
rl.on('close', function (code) {
mylog.info('child process exited with code ' + code); // 输出到控制台
mylog.info('挖矿程序执行完毕');
});
rl.on('message', function () {
job.touch();
});
rl.on('exit', function () {
typeof done === 'function' && done('挖矿程序执行完毕');
});
}
const jobs = [
// {
// name: 'mine',
// processor: mineJob,
// type: 'every',
// slot: '0 0 3 * * *',
// priority: 'highest',
// unique: {
// id: 'mine'
// },
// skipImmediate: true,
// timezone: "ETC/GMT+8"
// },
{
name: 'mineCorn',
processor: mineJob,
type: 'every',
slot: '0 0 2 * * *',
priority: 'highest',
unique: {
id: 'mine'
},
skipImmediate: true,
timezone: "ETC/GMT+8"
},
{
name: 'confirm',
processor: confirm,
type: 'every',
slot: '0 0/10 * * * *', // 59 */1 * * *
priority: 'highest',
unique: {
id: 'confirm'
},
// skipImmediate: true,
timezone: "ETC/GMT+8"
}
];
function mountJobs (Job) {
jobs.map(jobConfig => {
const { name, processor, type, slot, priority, unique, skipImmediate, timezone } = jobConfig;
Job.define(name, {
timezone,
skipImmediate,
priority,
unique: { 'data.type': 'active', 'data.userId': unique.id }
}, processor);
Job[type](slot, name);
});
}
module.exports = Job => mountJobs(Job);