0

我正在使用 Agenda 在某个时间安排我的工作。该作业将包含一定的电子邮件数组,这些电子邮件将在 10 秒的间隔内自动发送电子邮件,但问题是该作业未按预期执行。

无论计划时间设置为“2 分钟后”,调度程序都会立即运行。在启动服务器时,作业会立即运行并继续运行。除此之外,它还会打印出数据库中所有可用的条目。

这就是我安排工作的方式:

let Agenda = require("agenda");

let agenda = new Agenda();
agenda.database(`localhost:27017/${process.env.DB_NAME}`, "schedulers", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

var i = 0;
agenda.define("campaignScheduler", function (job) {
  i++;
  console.log(
    i +
      " Run at " +
      new Date().getHours() +
      ":" +
      new Date().getMinutes() +
      ":" +
      new Date().getSeconds()
  );
});
const testData = {
  name: "John Snow",
  userId: "j0dn.j213b455b.bchds0",
};

agenda.start();
agenda.on("ready", () => {
  agenda
    .create("campaignScheduler", testData)
    .unique({ "data.unique_id": testData.userId })
    .repeatEvery("*/10 * * * * *", {
      timezone: "America/Los_Angeles",
    })
    .schedule("in 2 minutes")
    .save();

  agenda.on("complete", (job) => {
    console.log(`finished job`, job.attrs);
  });

  agenda.on("job success", (job) => {
    console.log(`Successfull`);
  });

  agenda.on("job fail", (err, job) => {
    console.log(`Job failed with error: ${err.message}`);
  });
});

let graceful = () => {
  agenda.stop(() => process.exit(0));
};

process.on("SIGTERM", graceful);
process.on("SIGINT", graceful);

控制台上的结果:

在此处输入图像描述

db 上的结果:

在此处输入图像描述

保存到数据库的结果相当混乱。请帮助解决此问题。

4

1 回答 1

0

无论计划时间设置为“2 分钟后”,调度程序都会立即运行。

根据文档,议程似乎正在做它应该做的事情:

repeatEvery(间隔,[选项])

指定作业应重复的时间间隔。作业在定义时也以配置的时间间隔运行,即"run now and in interval"

此外,您正在尝试每秒钟安排一次运行X,这对于 cron 表达式是不可能的 -如此处所述。如果您想及时分发电子邮件,我建议您将它们排在代码库的其他位置,就像您对 HTTP 请求进行速率限制一样。

除此之外,它还会打印出数据库中所有可用的条目。

您正在打印job.attrs,这就是它的样子,因为您从事件中得到的是整个job实例。如果您只想打印提供的数据,请将代码更改为:

agenda.on("complete", (job) => {
  console.log(`finished job`, job.attrs.data); // <- add .data
});
于 2020-06-12T14:21:59.953 回答