如何解决节点Js:Redis作业完成任务后未完成
希望你们做的很棒。
我在自己的nodejs项目中实现了BullMQ(Bull的下一个主要版本),以安排作业发送电子邮件。例如,发送忘记密码请求的电子邮件。因此,我已经将代码编写如下。
用户服务:
await resetPasswordJob({email: 'xyz@test.com'}); // from service I'm calling a job
重置密码作业:
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;
重置密码解析器:
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;
但是问题是,如果我执行一次并尝试执行其他作业,那么该作业仅在执行,而没有最新执行。并在控制台中收到错误消息:
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)
谢谢你们!
解决方法
您的问题可以由几件事情引起。
首先,您有一项需要 30 秒以上才能完成的工作。
第二个你设置 worker.on 函数来监听事件,然后在完成或进度中你做了一些导致错误的事情。
第三,您在 redis 连接中设置 keyPrefix。删除它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。