【问题标题】:Bull job not getting triggered in cron[Node.js]公牛作业未在 cron [Node.js] 中触发
【发布时间】:2021-11-21 03:22:17
【问题描述】:

我使用bull 包设置了多个后台作业处理器,如下所示

import { CronJob } from 'cron';

import Queue from 'bull';

let queue = new Queue('workers', {
  //  settings: { lockDuration: 60 * 20000 },
  defaultJobOptions: {
    removeOnComplete: true
  },
});


queue
  .on('waiting', function(jobId) {
    // A Job is waiting to be processed as soon as a worker is idling.
    // workerLogger.info(`Job ${jobId} waiting to be processed `);
  })
  .on('completed', async(job, result) => {
    workerLogger.info(`Job ID: ${job.id}, Result: ${result}`);
    try {
      const jobbed = await queue.getJob(job.id);
      if (jobbed) {
        await jobbed.remove();
        workerLogger.info(`removed completed job ${job.id}`);
      }
    } catch (error) {
      throw new Error(error);
    }
  })
  .on('failed', function(job, err) {
    workerLogger.error('job ' + job.id + ' in queue failed... ' + err);
  })
  .on('error', function(err) {
    workerLogger.error('Queue Error... ' + err);
  })
  .on('stalled', function(job) {
    workerLogger.info(
      `stalled job, restarting it again! ${job.queue.name} ${JSON.stringify(
          job.data,
        )} ${job.id} ${job.name}`,
    );
  });

queue.process('healthCheckPing', concurrency, function(job, done) {
  jobs.healthCheckPing(job.data, done);
});

queue.process('test', concurrency, function(job, done) {
  jobs.test(job.data, done);
});

我尝试使用 cron 包基于 Crontime 运行作业,但只有 一个 作业得到处理,请查看下面的示例

  const cron = new CronJob({
    cronTime: '* * * * *',
    onTick: function() {
      (() => {
        workerLogger.info('Pushing test to queue...');

        queue.add('test');

        queue.add(
          'healthCheckPing',
          {
            jobName: 'test',
          },
        );
      })();
    },
    start: true,
    timeZone: 'Africa/Lagos',
  });

我已经尝试了很多方法来使它工作,但似乎没有一个工作,将在下面列出一些

  • 正在运行等待 queue.obliterate({ force: true });
  • 在单独的实例上运行工作处理器
  • 为作业添加延迟 - queue.add('test',{}, {delay:500});
  • 为作业添加优先级 - queue.add('test',{}, {priority:1});

在上面的两个作业(test, healthCheckPing)中,只有一个总是被触发。

也就是说,要么处理名为 test 的作业,而另一个不处理,要么处理名为 healthCheckPing 的作业,而另一个不处理

这是下面的作业处理器函数

const jobs = {};

jobs.test = (_, done) => {
  try {
    workerLogger.error('test');

    done(false, 'ok');
  } catch (e) {
    done(e);
  }
};

jobs.healthCheckPing = async({
  jobName
}, done) => {
  try {
    workerLogger.info('health check pinger');

    if (!jobName) throw new Error('uuid not passed');

    // jobname is the slug for monitor

    // use pingkey to negate between staging and prod monitors
    const pingKey = !process.env.NODE_ENV || process.env.NODE_ENV !== 'production' ?
      process.env.STAGING_HEALTH_CHECK_KEY :
      process.env.PROD_HEALTH_CHECK_KEY;

    const url = `https://hc-ping.com/${pingKey}/${jobName}`;

    await axios.get(url);

    done(false, `pinged ${jobName}!`);
  } catch (error) {
    done(error);
  }
};

export default jobs;

此代码在我的本地机器上完美运行,但仅此问题 在生产时发生。节点服务器使用 pm2(cluster mode, instance = 1) 运行

【问题讨论】:

  • 以上代码只需在作业处理器函数中调用一个简单的done() 即可正常工作。由于您没有发布代码 - 这可能就是问题所在。
  • 谢谢@madflow,但我怀疑这是否是问题所在。我已经编辑了问题以包含功能
  • @madflow,代码在我的本地机器上完美运行。使用pm2时服务器出现问题

标签: javascript node.js cron bull bullmq


【解决方案1】:

问题是因为我在另一个服务中使用了相同队列名称共享相同的 Redis 连接,

let queue = new Queue('workers', {
  //  settings: { lockDuration: 60 * 20000 },
  defaultJobOptions: {
    removeOnComplete: true
  },
});

工人换成其他人解决了这个问题

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 2020-09-20
    • 2017-07-26
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    相关资源
    最近更新 更多