Loopback 4 cron / запланированные задачи - PullRequest
0 голосов
/ 22 февраля 2019

Я хотел бы запускать запланированные задачи для моего Loopback 4 API.Я могу легко настроить запланированные задачи, используя узел, используя такие пакеты, как node-cron или node-schedule.

У меня вопрос: где и как мне реализовать этот код в моем Loopback 4 API?

Моя идея - написать Custom Booter, который будет обнаруживать и запускать логику cron при «загрузке» Loopback API.Однако не уверен, что я иду по правильному пути здесь.https://loopback.io/doc/en/lb4/Booting-an-Application.html#custom-booters

Ответы [ 2 ]

0 голосов
/ 21 августа 2019

Это решение сработало для меня.

Установка

https://www.npmjs.com/package/node-cron
$ npm install --save node-cron

Создание компонента

import { CronController } from "./controller/cron.controller";
const cron = require('node-cron');

export class Cron {
  constructor(
    protected cronController: CronController,
  ) {
  }

  async start() {
    this.eachMinute();
  }

  private async eachMinute() {
    console.log('Start Cron Jobs');

    cron.schedule('* * * * *', async () => {
      await this.cronController.start();
      console.log('running a task every minute');
    });
  }
}

Использование Loopback DI Container для получения экземпляра контроллера:

// index.ts
export async function main(options: ApplicationConfig = {}) {
  const app = new MyApplication(options);
  await app.boot();
  await app.start();

  const url = app.restServer.url;
  console.log(`Server is running at ${url}`);
  console.log(`Try ${url}/ping`);

  // Instanciate CronController
  const cronController = app.controller(CronController);

  // Get Instance
  const cronControllerInstance = await cronController.getValue(app);

  // Inject by constructor
  const cron = new Cron(cronControllerInstance);

  // Invoke method
  cron.start();

  return app;
}

Оригинальный ответ https://github.com/strongloop/loopback/issues/4047#issuecomment-523637653

0 голосов
/ 22 февраля 2019

У нас была точно такая же задача, и мы выполнили ее так, как вы описали, то есть мы инициализируем наши задачи на основе cron в загрузочных скриптах.Это работает очень хорошо.

Есть некоторые вещи, которые вы, возможно, должны учитывать при выполнении задач в Node.js:

  • Если вы планируете запускать несколько экземпляров приложения Node (длянапример, с pm2 или чем-то еще), вам может потребоваться убедиться, что ваши задачи будут выполняться только на одном основном узле, а не на всех узлах одновременно.Если первичный узел дает сбой, следующий узел должен быть выбран в качестве нового первичного.В зависимости от бизнес-логики, это может не быть проблемой в вашем случае.В нашем случае это было обязательно, и нам удалось реализовать его с помощью консультативных блокировок в PG (мы использовали комбинацию pg_try_advisory_xact_lock и pg_advisory_xact_lock)
  • Возможно, вы захотите реализовать опцию для остановки / запуска задач, а также для просмотраего статусы через Loopback API / Loopback Explorer.Мы сделали несколько пользовательских методов API в Loopback, чтобы сделать именно это, и нашли это очень полезным

У меня вопрос, где и как мне реализовать этот код в моем Loopback 4 API?

Итак, ответ на этот вопрос - реализуйте его так, как вы предлагали.Вы можете инициализировать свои задачи в пользовательском загрузчике.Вы также должны учитывать пункты, которые я упомянул выше, в зависимости от потребностей вашего бизнеса.

...