Node.js 基于bull的节点cron作业调度

Node.js 基于bull的节点cron作业调度,node.js,mongoose,cron,schedule,Node.js,Mongoose,Cron,Schedule,在我的Node Express应用程序中,我需要根据用户从UI上可用的日历中选择的开始时间日期和结束时间日期来安排作业(连接LinkedIn配置文件)。计划对少数选定的数据批执行作业,直到日期时间要求匹配为止 我正在使用npm package Bull来处理作业队列和调度,但它似乎不起作用。作业(用于连接LinkedIn配置文件)或简单控制台(用于测试),在设置计时器或从UI创建新作业时立即执行,而不是在定义的开始时间执行 这是我的密码: const Queue = require("bull"

在我的Node Express应用程序中,我需要根据用户从UI上可用的日历中选择的开始时间日期和结束时间日期来安排作业(连接LinkedIn配置文件)。计划对少数选定的数据批执行作业,直到日期时间要求匹配为止

我正在使用npm package Bull来处理作业队列和调度,但它似乎不起作用。作业(用于连接LinkedIn配置文件)或简单控制台(用于测试),在设置计时器或从UI创建新作业时立即执行,而不是在定义的开始时间执行

这是我的密码:

const Queue = require("bull");
const mongoose = require("mongoose");
const schedulerJobs = require("../api/models/schedulerJobs");

var id = mongoose.Types.ObjectId();
var HTMLParser = require("node-html-parser");
var { fetchSendConnectionData } = require("./services");
var { setLeadName } = require("./utils");

module.exports = async function connectionScheduler(
  userId,
  cookieName,
  leads,
  start,
  end,
  campaign_name,
  connection_message,
  campaign_id
) {
  var i = 0;
  var parse_message = HTMLParser.parse(
    connection_message
  ).structuredText.toString();

  // 1. Initiating the Queue
  const campaignQueue = new Queue("Campaign", {
    redis: {
      host: "127.0.0.1",
      port: 6379,
    },
  });

  const data = leads;

  const options = {
    attempts: 2,
    delay: 5000,
    repeat: {
      cron: "*/2 * * * * *",
      tz: "America/Los_Angeles",
      startDate: start,
      endDate: end,
    },
  };

  // 2. Adding a Job to the Queue
  campaignQueue.add(`${campaign_name}`, data, options);

  // 3. Consumer
  campaignQueue.process(async (job) => {
    campaignQueue.close();

    return await console.log("CRON started.....");

    console.log(
      `Connection Cron For ${campaign_name} Now Points To Index => ${i}`
    );
    fetchSendConnectionData({
      name: cookieName,
      profile_links: job[i].profileUrl,
      message: setLeadName(parse_message, job[i].name),
    })
      .then(({ data: { message } }) => {
        if (message === "Connection send") {
          console.log(
            `Its Been 5 Minutes And Connection Request Is Sent To => ${job[i].name}`
          );
        } else {
          console.log(
            `Connection Request To => ${job[i].name} Has Failed So Now We Move On To The Next One`
          );
        }
        i = i + 1;
        if (i === job.length) {
          job.close();
        }
      })
      .catch((err) => {
        console.log(
          `Connection Request To => ${job[i].name} Has Failed Due To => ${err.message}`
        );
        i = i + 1;
        if (i === job.length) {
          job.close();
        }
      });
  });

  // 4. Listener
  campaignQueue.on("error", (err) => {
    // console.log(`Job completed with result ${result}`);
  });

  campaignQueue.on("progress", function (job, progress) {
    // A job's progress was updated!
  });

  campaignQueue.on("completed", (job, result) => {
    // console.log("job completed", job);

    //save job completed to database
    const jobdetail = {
      userId,
      start,
      end,
      campaign_id,
      campaign_name,
      connection_message,
      jobId: job.opts.jobId,
    };

    const schedulerjobs = new schedulerJobs(jobdetail);
    schedulerjobs.save().then((scheduledjob) => console.log("Job saved to db"));
  });

  campaignQueue.on("failed", function (job, err) {
    // A job failed with reason `err`!
  });
};
服务器启动后,会立即打印输出:

CRON started.....
Job saved to db
它不等待
开始
,只运行一次,直到
结束
才保持运行


请帮助解决此问题返回后的任何代码行都将被忽略。 试试这个:

    // return await console.log("CRON started.....");
    await console.log("CRON started.....");
如果需要,在函数结尾处放置一个空的返回值