Node.js 在节点中将作业保存到议程时阻止立即执行

Node.js 在节点中将作业保存到议程时阻止立即执行,node.js,mongodb,agenda,Node.js,Mongodb,Agenda,我正在使用由MongoDB支持的带有节点的agenda.js来处理批处理作业。我在使用当前语法时遇到的一个问题是,计划重复事件,但不让它立即执行。我知道skipImmediate:true标志,但我不清楚在我当前的配置中需要在哪里应用它,我在哪里使用IIFE: agenda.define('test job', { priority: 'high', concurrency: 10 }, async job => { const { to

我正在使用由MongoDB支持的带有节点的agenda.js来处理批处理作业。我在使用当前语法时遇到的一个问题是,计划重复事件,但不让它立即执行。我知道skipImmediate:true标志,但我不清楚在我当前的配置中需要在哪里应用它,我在哪里使用IIFE:

  agenda.define('test job', {
    priority: 'high',
    concurrency: 10
  }, async job => {
    const {
      to
    } = job.attrs.data;
    job.repeatEvery('0 11 * * 1-5', {
      skipImmediate: true
    });
    await send(to);
  });

  function send(to) {
    const today = new Date();
    const target = to;
    const time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
    console.log(`Emailing to ${target} regarding second job, at ${time}.`);
  }

  (async function () {
    await agenda.start();
    agenda.create('test job', {
      to: 'someone@email.com',
      from: 'sample@email.com'
    }).save();
  })();
};
正如你所看到的,我已经

{ skipImmediate: true }

。。。在每一个街区,但它似乎不起作用。如何使用当前配置防止立即执行?

我认为您可以使用mongoose事务来避免立即执行

const mongoose = require('mongoose');

Start a session

    const session = await mongoose.startSession();
    session.startTransaction();

    try{
      agenda.define('test job', {
        priority: 'high',
        concurrency: 10
      }, async job => {
        const {
          to
        } = job.attrs.data;
        job.repeatEvery('0 11 * * 1-5', {
          skipImmediate: true
        });
        await send(to);
      }).session(session);

     function send(to) {
        const today = new Date();
        const target = to;
        const time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
        console.log(`Emailing to ${target} regarding second job, at ${time}.`);
      }
     async () => {
        await agenda.start();
        agenda.create('test job', {
          to: 'someone@email.com',
          from: 'sample@email.com'
        }).session(session).save();
        await session.commitTransaction();
      };
    } catch (err) {
            await session.abortTransaction();
            throw err;
        } finally {
            session.endSession();
        }
    }

请尝试参考以了解更多详细信息

我认为您可以使用mongoose事务来避免立即执行

const mongoose = require('mongoose');

Start a session

    const session = await mongoose.startSession();
    session.startTransaction();

    try{
      agenda.define('test job', {
        priority: 'high',
        concurrency: 10
      }, async job => {
        const {
          to
        } = job.attrs.data;
        job.repeatEvery('0 11 * * 1-5', {
          skipImmediate: true
        });
        await send(to);
      }).session(session);

     function send(to) {
        const today = new Date();
        const target = to;
        const time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
        console.log(`Emailing to ${target} regarding second job, at ${time}.`);
      }
     async () => {
        await agenda.start();
        agenda.create('test job', {
          to: 'someone@email.com',
          from: 'sample@email.com'
        }).session(session).save();
        await session.commitTransaction();
      };
    } catch (err) {
            await session.abortTransaction();
            throw err;
        } finally {
            session.endSession();
        }
    }

请尝试参考以了解更多详细信息

我认为您正在使任务复杂化,这可能适用于您的情况

agenda.define('test job', {
priority: 'high',
concurrency: 10
}, async job => {
const {to} = job.attrs.data;
const today = new Date();
const target = to;
const time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
console.log(`Emailing to ${target} regarding second job, at ${time}.`);
});
这是打电话的

(async function () {
  const returned= agenda.create('test job', {to:'someone@email.com',from:'sample@email.com'})
  await agenda.start();
  await returned.repeatEvery('0 11 * * 1-5',{skipImmediate: true}).save()
})();

它所做的是定义您的日程应该做什么,然后使用参数创建日程并启动它。它返回作业,您可以使用repeatEvery重复作业。我认为您使任务复杂化了,在您的情况下,这可能会起作用

agenda.define('test job', {
priority: 'high',
concurrency: 10
}, async job => {
const {to} = job.attrs.data;
const today = new Date();
const target = to;
const time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
console.log(`Emailing to ${target} regarding second job, at ${time}.`);
});
这是打电话的

(async function () {
  const returned= agenda.create('test job', {to:'someone@email.com',from:'sample@email.com'})
  await agenda.start();
  await returned.repeatEvery('0 11 * * 1-5',{skipImmediate: true}).save()
})();

它所做的是定义您的日程应该做什么,然后使用参数创建日程并启动它。它返回作业,您可以使用repeatEvery重复它。我有点困惑,所以您是否要立即运行作业?我想定义作业并将其保存到数据库,但直到我显式地使用repeatEvery设置的日期/时间才让它运行。我遗漏了什么吗?根据我上面的代码,这将定义一个作业,并将其保存到数据库中。它将在我在repeatEvery中定义的时间到达时运行。但我也遇到了这样一个问题:当我调用这个文件时,作业就会运行,而不是只在repeatEvery值到达时运行。如何使用agenda.js处理这个问题?我有点困惑,所以您是否希望立即运行作业?我希望定义作业并将其保存到数据库,但在我显式地使用repeatEvery设置的日期/时间之前不让它运行。我是否遗漏了什么?根据我上面的代码,这将定义一个作业,并将其保存到数据库中。它将在我在repeatEvery中定义的时间到达时运行。但我也遇到了这样一个问题:当我调用这个文件时,作业就会运行,而不是只在repeatEvery值到达时运行。如何使用agenda.js处理这个问题?谢谢,但我更喜欢使用内置的agenda方法来处理这个问题。我假设该选项必须存在,因为这似乎是一种非常常见的情况—希望定义作业并将其保存到db,但在使用repeatEvery显式定义时间值之前不运行它。谢谢,但我更喜欢使用内置的日程方式来处理此问题。我假设该选项必须存在,因为这似乎是一种非常常见的情况—希望定义作业并将其保存到数据库,但在使用repeatEvery显式定义时间值之前不运行它。谢谢—这很有效!关于过于复杂的问题,额外的发送功能只是为了模仿其他一些单独完成的工作而设计的!但是,如果你打算增加与同一议程无关的工作,你最好制定单独的议程。代码可能更易于阅读和调试:是的,但是假设我需要运行一些代码来收集/格式化一些数据,然后再将其提供给任务,那么我想在这里执行。所以仍然是一项工作——但这意味着必须先做一些掠夺性的工作来准备数据。js在其文档中有类似的示例。请参阅下面的示例…agenda.define'printAnalyticsReport',异步作业=>{const users=wait User.doSomethingReallyIntensive;processUserDatausers;console.log'I print a report!';};议程。每“15分钟”、“打印分析报告”;是的,那样的话你可以做。但有一个警告,因为现在您正在使用wait调用send函数,该函数将以异步方式运行,所以如果您想在运行作业之前格式化数据,请确保它是以同步方式运行的,这样您就不会有奇怪的输出,因为我假设您想在每个作业中解析数据。谢谢-这很有效!关于过于复杂的问题,额外的发送功能只是为了模仿其他一些单独完成的工作而设计的!但是,如果你打算增加与同一议程无关的工作,你最好制定单独的议程。代码可能更易于阅读和调试:是的,但是假设我需要运行一些代码来收集/格式化一些数据,然后再将其提供给任务,那么我想在这里执行。所以仍然是一项工作——但这意味着必须先做一些掠夺性的工作来准备数据。js在其文档中有类似的示例。请参阅下面的示例…agenda.define'printAnalyticsReport',异步作业=>{const users=wait User.doSomethingReallyIntensive;processUserDatausers;console.log'I print a report!';};议程每15分钟一次printAna
lyticsReport';是的,那样的话你可以做。但有一个警告,因为现在您正在使用wait调用send函数,它将以异步方式运行,所以如果您想在运行job之前格式化数据,请确保它是以同步方式运行的,这样您就不会有奇怪的输出,因为我假设您想用每个job解析数据。