mirror of
https://gitee.com/dromara/electron-egg.git
synced 2026-05-15 04:02:10 +08:00
163 lines
4.2 KiB
JavaScript
163 lines
4.2 KiB
JavaScript
'use strict';
|
||
|
||
const { logger } = require('ee-core/log');
|
||
const { ChildJob, ChildPoolJob } = require('ee-core/jobs');
|
||
|
||
/**
|
||
* framework
|
||
* @class
|
||
*/
|
||
class FrameworkService {
|
||
|
||
constructor() {
|
||
// 在构造函数中初始化一些变量
|
||
this.myTimer = null;
|
||
this.myJob = new ChildJob();
|
||
this.myJobPool = new ChildPoolJob();
|
||
this.taskForJob = {};
|
||
}
|
||
|
||
/**
|
||
* test
|
||
*/
|
||
async test(args) {
|
||
let obj = {
|
||
status:'ok',
|
||
params: args
|
||
}
|
||
logger.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) => {
|
||
logger.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});
|
||
}
|
||
if (action == 'pause') {
|
||
oneTask = this.taskForJob[jobId];
|
||
oneTask.callFunc('./jobs/example/timer', 'pause', jobId);
|
||
}
|
||
if (action == 'resume') {
|
||
oneTask = this.taskForJob[jobId];
|
||
oneTask.callFunc('./jobs/example/timer', 'resume', jobId, oneTask.pid);
|
||
}
|
||
|
||
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) => {
|
||
logger.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;
|
||
}
|
||
|
||
/**
|
||
* 获取正在运行的 job 进程
|
||
*/
|
||
monitorJob() {
|
||
setInterval(() => {
|
||
let jobPids = this.myJob.getPids();
|
||
let jobPoolPids = this.myJobPool.getPids();
|
||
logger.info(`[main-process] [monitorJob] jobPids: ${jobPids}, jobPoolPids: ${jobPoolPids}`);
|
||
}, 5000)
|
||
}
|
||
|
||
}
|
||
|
||
FrameworkService.toString = () => '[class FrameworkService]';
|
||
module.exports = {
|
||
FrameworkService,
|
||
frameworkService: new FrameworkService()
|
||
};
|