From 432083de2052a0eb9474cf64dddbbdb6481f1b3f Mon Sep 17 00:00:00 2001 From: gaoshuaixing Date: Wed, 21 Jun 2023 18:28:01 +0800 Subject: [PATCH] =?UTF-8?q?job=E4=BB=BB=E5=8A=A1=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/jobs/example/timer.js | 7 ++- electron/service/framework.js | 19 ++++-- frontend/src/views/framework/jobs/Index.vue | 68 +++++++++++++-------- 3 files changed, 63 insertions(+), 31 deletions(-) diff --git a/electron/jobs/example/timer.js b/electron/jobs/example/timer.js index 7f8bad3..f2bae91 100644 --- a/electron/jobs/example/timer.js +++ b/electron/jobs/example/timer.js @@ -23,13 +23,14 @@ class TimerJob extends Job { Log.info("[child-process] TimerJob params: ", this.params); // 计时器任务 - let eventName = 'job-timer-progress'; + let number = 0; let jobId = this.params.jobId; + let eventName = 'job-timer-progress-' + jobId; let timer = setInterval(function() { Hello.welcome(); - childMessage.send(eventName, {jobId, number}); + childMessage.send(eventName, {jobId, number, end: false}); number++; }, 1000); @@ -39,7 +40,7 @@ class TimerJob extends Job { clearInterval(timer); // 任务结束,重置前端显示 - childMessage.send(eventName, {jobId, number:0, pid:0}); + childMessage.send(eventName, {jobId, number:0, pid:0, end: true}); // 如果是childJob任务,必须调用 Ps.exit() 方法,让进程退出,否则会常驻内存 // 如果是childPoolJob任务,常驻内存,等待下一个业务 diff --git a/electron/service/framework.js b/electron/service/framework.js index d7b1c21..cdf5696 100644 --- a/electron/service/framework.js +++ b/electron/service/framework.js @@ -68,8 +68,9 @@ class FrameworkService extends Service { 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('job-timer-progress', (data) => { + timerTask.emitter.on(eventName, (data) => { Log.info('[main-process] timerTask, from TimerJob data:', data); // 发送数据到渲染进程 event.sender.send(`${channel}`, data) @@ -77,7 +78,7 @@ class FrameworkService extends Service { // 执行任务及监听进度 异步 // myjob.execPromise('./jobs/example/timer', {jobId}).then(task => { - // task.emitter.on('job-timer-progress', (data) => { + // task.emitter.on(eventName, (data) => { // Log.info('[main-process] timerTask, from TimerJob data:', data); // // 发送数据到渲染进程 // event.sender.send(`${channel}`, data) @@ -115,12 +116,22 @@ class FrameworkService extends Service { if (action == 'run') { // 异步-执行任务及监听进度 this.myJobPool.runPromise('./jobs/example/timer', {jobId}).then(task => { - task.emitter.on('job-timer-progress', (data) => { + + // 监听器名称唯一,否则会出现重复监听。 + // 任务完成时,需要移除监听器,防止内存泄漏 + 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; }); } diff --git a/frontend/src/views/framework/jobs/Index.vue b/frontend/src/views/framework/jobs/Index.vue index a726c0b..b8de3f3 100644 --- a/frontend/src/views/framework/jobs/Index.vue +++ b/frontend/src/views/framework/jobs/Index.vue @@ -31,30 +31,44 @@

执行任务3 - 进度:{{ progress3 }} , 进程pid:{{ progress3_pid }} + 进度:{{ progress3 }} ,进程pid:{{ progress3_pid }}

执行任务4 - 进度:{{ progress4 }} , 进程pid:{{ progress4_pid }} - + 进度:{{ progress4 }} ,进程pid:{{ progress4_pid }} + +

+ + 执行任务5 + 进度:{{ progress5 }} ,进程pid:{{ progress5_pid }} + +

+ + 执行任务6 + 进度:{{ progress6 }} ,进程pid:{{ progress6_pid }} +