Предотвращение немедленного выполнения при сохранении задания в повестке дня в узле - PullRequest
0 голосов
/ 10 октября 2019

Я использую повестку дня.js с узлом, поддерживаемым MongoDB, для обработки пакетных заданий. Одна проблема, с которой я сталкиваюсь с текущим синтаксисом, который я использую, - это планирование повторяющегося события, но не немедленное его выполнение. Мне известен флаг "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 }

... в блоке repeatEvery, но это не похоже на работу. Как я могу предотвратить немедленное выполнение с моей текущей конфигурацией?

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Я думаю, что вы усложняете задачу, это может работать в вашем случае

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()
})();

То, что это делает, define определит, что вашПовестка дня должна сделать, тогда вы create повестки дня с parameters и запустите ее. Возвращает Job, и вы можете повторить его, используя repeatEvery

1 голос
/ 10 октября 2019

Я думаю, вы можете использовать транзакции 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 для получения более подробной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...