首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点Js:完成任务后,Redis作业尚未完成。

节点Js:完成任务后,Redis作业尚未完成。
EN

Stack Overflow用户
提问于 2020-10-15 07:12:06
回答 1查看 2.7K关注 0票数 3

希望你们做得很好。

我在我的nodejs项目中实现了BullMQ (Bull的下一个主要版本)来安排任务来发送电子邮件。例如,发送忘记密码的电子邮件请求。因此,我编写了如下代码。

用户服务:

代码语言:javascript
复制
await resetPasswordJob({email: 'xyz@test.com'});       // from service I'm calling a job

重置密码作业:

代码语言:javascript
复制
const {Queue} = require('bullmq');
const IOredis = require('ioredis');

const connection = new IOredis(process.env.REDIS_PORT || 6379);
const resetPasswordResolver = require('../resolvers/resetPasswordResolver');

const resetPasswordJob = async (payload) => {
  const queue = new Queue('default', {connection});        // 'default' is queue name

  // Added below line, because I was getting this issue sometime
  // "MaxListenersExceededWarning: Possible EventEmitter memory leak detected."
  queue.setMaxListeners(queue.getMaxListeners() + 1); 
      
  await queue.add('resetPassword', payload, {
    removeOnFail: true,
    removeOnComplete: true,
  });               // 'resetPassword' is job name

  const worker = new Worker('default', async (job) => 
     await resetPasswordResolver(job.data)
  );
  worker.on('completed', (job) => {
    console.log(`Worker Mesg: ${job.id} has completed.`);
    done();
  });
  worker.on('failed', (job, err) => {
    console.log(
      `Worker Mesg: ${job.id} has failed with ${err.message}!`
    );
    done();
  });
};

module.exports = resetPasswordJob;

重置密码解析器:

代码语言:javascript
复制
const sendMail = require('../../utils/sendMail');

const resetPasswordMailResolver = async (payload) => {
  const body = `<html>Some html email template here</html>`;
  await sendMail({to: payload.email, subject: 'Reset your account password', body: body});

  return {};
};

module.exports = resetPasswordMailResolver;

但问题是,如果我只执行一次并尝试执行其他作业,那么这个作业只是在执行,而不是最近的一个。并在控制台中获得错误消息:

代码语言:javascript
复制
Worker Mesg: 7 has completed.
Error: Missing lock for job 7 failed
    at Function.finishedErrors (/home/admini/Documents/node-project/node_modules/bullmq/dist/classes/scripts.js:135:24)
    at Job.moveToFailed (/home/admini/Documents/node-project/node_modules/bullmq/dist/classes/job.js:197:41)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async handleFailed (/home/admini/Documents/node-project/node_modules/bullmq/dist/classes/worker.js:207:17)
    at async Worker.run (/home/admini/Documents/node-project/node_modules/bullmq/dist/classes/worker.js:90:33)

我无法为这个错误找到任何具体的解决方案。请帮帮我。

谢谢你们!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-03 13:20:29

你的问题可以通过几件事来解决。

首先,您有一项工作需要超过30秒才能完成。其次,您将worker.on函数设置为侦听事件以及已完成的事件或进度时,您所做的导致错误的事情。第三,在redis连接中设置keyPrefix。只要移除它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64366547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档