Узел Js: задание Redis не завершается после завершения своей задачи

#node.js #redis #queue #job-scheduling #bullmq

#node.js #redis #очередь #планирование заданий #bullmq

Вопрос:

Надеюсь, у вас, ребята, все отлично.

Я внедрил BullMQ (следующую основную версию Bull) в свой проект nodejs, чтобы запланировать задания для отправки электронных писем. Например, отправьте электронное письмо с запросом забыть пароль. Итак, я написал свой код примерно так, как показано ниже.

Обслуживание пользователей:

 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)
  

Я не могу найти какое-либо конкретное решение для этой ошибки. Пожалуйста, помогите мне.

Спасибо, ребята!

Комментарии:

1. github.com/OptimalBits/bull/issues/1415 похоже, вам нужно обновление

Ответ №1:

ваша проблема может быть вызвана несколькими причинами.

сначала у вас есть задание, для завершения которого требуется более 30 секунд.

во-вторых, вы устанавливаете функцию worker.on для прослушивания событий, а внутри по завершению или по ходу выполнения вы делаете что-то, что вызывает ошибку.

в-третьих, вы устанавливаете ключевое исправление в соединении redis. просто удалите его.