195 lines
5.0 KiB
JavaScript
195 lines
5.0 KiB
JavaScript
|
|
'use strict';
|
|||
|
|
|
|||
|
|
const { Service } = require('ee-core');
|
|||
|
|
const Log = require('ee-core/log');
|
|||
|
|
const { ChildJob, ChildPoolJob } = require('ee-core/jobs');
|
|||
|
|
const HttpClient = require('ee-core/httpclient');
|
|||
|
|
const Ps = require('ee-core/ps');
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* framework
|
|||
|
|
* @class
|
|||
|
|
*/
|
|||
|
|
class FrameworkService extends Service {
|
|||
|
|
|
|||
|
|
constructor(ctx) {
|
|||
|
|
super(ctx);
|
|||
|
|
|
|||
|
|
// 在构造函数中初始化一些变量
|
|||
|
|
this.myTimer = null;
|
|||
|
|
this.myJob = new ChildJob();
|
|||
|
|
this.myJobPool = new ChildPoolJob();
|
|||
|
|
this.taskForJob = {};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* test
|
|||
|
|
*/
|
|||
|
|
async test(args) {
|
|||
|
|
let obj = {
|
|||
|
|
status:'ok',
|
|||
|
|
params: args
|
|||
|
|
}
|
|||
|
|
Log.info('FrameworkService obj:', obj);
|
|||
|
|
return obj;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* ipc通信(双向)
|
|||
|
|
*/
|
|||
|
|
bothWayMessage(type, content, event) {
|
|||
|
|
// 前端ipc频道 channel
|
|||
|
|
const channel = 'controller.framework.ipcSendMsg';
|
|||
|
|
|
|||
|
|
if (type == 'start') {
|
|||
|
|
// 每隔1秒,向前端页面发送消息
|
|||
|
|
// 用定时器模拟
|
|||
|
|
this.myTimer = setInterval(function(e, c, msg) {
|
|||
|
|
let timeNow = Date.now();
|
|||
|
|
let data = msg + ':' + timeNow;
|
|||
|
|
e.reply(`${c}`, data)
|
|||
|
|
}, 1000, event, channel, content)
|
|||
|
|
|
|||
|
|
return '开始了'
|
|||
|
|
} else if (type == 'end') {
|
|||
|
|
clearInterval(this.myTimer);
|
|||
|
|
return '停止了'
|
|||
|
|
} else {
|
|||
|
|
return 'ohther'
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 执行任务
|
|||
|
|
*/
|
|||
|
|
doJob(jobId, action, event) {
|
|||
|
|
let res = {};
|
|||
|
|
let oneTask;
|
|||
|
|
const channel = 'controller.framework.timerJobProgress';
|
|||
|
|
if (action == 'create') {
|
|||
|
|
// 执行任务及监听进度
|
|||
|
|
let eventName = 'job-timer-progress-' + jobId;
|
|||
|
|
const timerTask = this.myJob.exec('./jobs/example/timer', {jobId});
|
|||
|
|
timerTask.emitter.on(eventName, (data) => {
|
|||
|
|
Log.info('[main-process] timerTask, from TimerJob data:', data);
|
|||
|
|
// 发送数据到渲染进程
|
|||
|
|
event.sender.send(`${channel}`, data)
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
// 执行任务及监听进度 异步
|
|||
|
|
// myjob.execPromise('./jobs/example/timer', {jobId}).then(task => {
|
|||
|
|
// task.emitter.on(eventName, (data) => {
|
|||
|
|
// Log.info('[main-process] timerTask, from TimerJob data:', data);
|
|||
|
|
// // 发送数据到渲染进程
|
|||
|
|
// event.sender.send(`${channel}`, data)
|
|||
|
|
// })
|
|||
|
|
// });
|
|||
|
|
|
|||
|
|
res.pid = timerTask.pid;
|
|||
|
|
this.taskForJob[jobId] = timerTask;
|
|||
|
|
}
|
|||
|
|
if (action == 'close') {
|
|||
|
|
oneTask = this.taskForJob[jobId];
|
|||
|
|
oneTask.kill();
|
|||
|
|
event.sender.send(`${channel}`, {jobId, number:0, pid:0});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return res;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 创建pool
|
|||
|
|
*/
|
|||
|
|
doCreatePool(num, event) {
|
|||
|
|
const channel = 'controller.framework.createPoolNotice';
|
|||
|
|
this.myJobPool.create(num).then(pids => {
|
|||
|
|
event.reply(`${channel}`, pids);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 通过进程池执行任务
|
|||
|
|
*/
|
|||
|
|
doJobByPool(jobId, action, event) {
|
|||
|
|
let res = {};
|
|||
|
|
const channel = 'controller.framework.timerJobProgress';
|
|||
|
|
if (action == 'run') {
|
|||
|
|
// 异步-执行任务及监听进度
|
|||
|
|
this.myJobPool.runPromise('./jobs/example/timer', {jobId}).then(task => {
|
|||
|
|
|
|||
|
|
// 监听器名称唯一,否则会出现重复监听。
|
|||
|
|
// 任务完成时,需要移除监听器,防止内存泄漏
|
|||
|
|
let eventName = 'job-timer-progress-' + jobId;
|
|||
|
|
task.emitter.on(eventName, (data) => {
|
|||
|
|
Log.info('[main-process] [ChildPoolJob] timerTask, from TimerJob data:', data);
|
|||
|
|
|
|||
|
|
// 发送数据到渲染进程
|
|||
|
|
event.sender.send(`${channel}`, data)
|
|||
|
|
|
|||
|
|
// 如果收到任务完成的消息,移除监听器
|
|||
|
|
if (data.end) {
|
|||
|
|
task.emitter.removeAllListeners(eventName);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
res.pid = task.pid;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
return res;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* test
|
|||
|
|
*/
|
|||
|
|
monitorJob() {
|
|||
|
|
setInterval(() => {
|
|||
|
|
let jobPids = this.myJob.getPids();
|
|||
|
|
let jobPoolPids = this.myJobPool.getPids();
|
|||
|
|
Log.info(`[main-process] [monitorJob] jobPids: ${jobPids}, jobPoolPids: ${jobPoolPids}`);
|
|||
|
|
}, 5000)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 上传到smms
|
|||
|
|
*/
|
|||
|
|
async uploadFileToSMMS(tmpFile) {
|
|||
|
|
const res = {
|
|||
|
|
code: 1000,
|
|||
|
|
message: 'unknown error',
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const headersObj = {
|
|||
|
|
'Content-Type': 'multipart/form-data',
|
|||
|
|
'Authorization': 'aaaaaaaaaaaaa' // 请修改这个token,用你自己的账号token
|
|||
|
|
};
|
|||
|
|
const url = 'https://sm.ms/api/v2/upload';
|
|||
|
|
const hc = new HttpClient();
|
|||
|
|
const response = await hc.request(url, {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: headersObj,
|
|||
|
|
files: {
|
|||
|
|
smfile: tmpFile,
|
|||
|
|
},
|
|||
|
|
dataType: 'json',
|
|||
|
|
timeout: 15000,
|
|||
|
|
});
|
|||
|
|
const result = response.data;
|
|||
|
|
if (Ps.isDev()) {
|
|||
|
|
Log.info('[FrameworkService] [uploadFileToSMMS]: info result:%j', result);
|
|||
|
|
}
|
|||
|
|
if (result.code !== 'success') {
|
|||
|
|
Log.error('[FrameworkService] [uploadFileToSMMS]: res error result:%j', result);
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
} catch (e) {
|
|||
|
|
Log.error('[FrameworkService] [uploadFileToSMMS]: ERROR ', e);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return res;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
FrameworkService.toString = () => '[class FrameworkService]';
|
|||
|
|
module.exports = FrameworkService;
|