Loopback 4 cron /预定任务

问题描述 投票:0回答:1

我想为我的Loopback 4 API运行计划任务。我可以使用node-cron或node-schedule等软件包轻松地使用节点设置计划任务。

我的问题是我在Loopback 4 API中应该在何处以及如何实现此代码?

我的想法是编写一个Custom Booter,它将在Loopback API“启动”时发现并运行cron逻辑。但是不确定我是否在这里走正确的道路。 https://loopback.io/doc/en/lb4/Booting-an-Application.html#custom-booters

node.js loopbackjs loopback
1个回答
1
投票

我们完成了相同的任务并按照您描述的方式执行,即我们在启动脚本中初始化基于cron的任务。它工作得很好。

在Node.js中执行任务时,您可能需要考虑以下事项:

  • 如果您计划运行Node应用程序的多个实例(例如使用pm2或其他内容),则可能需要确保您的任务只能在一个主节点上运行,而不是在所有节点上同时运行。如果主节点发生故障,则必须选择下一个节点作为新主节点。根据业务逻辑,在您的情况下可能不是问题。在我们的例子中它是强制性的,我们设法使用PG中的咨询锁来实现它(我们使用了pg_try_advisory_xact_lock和pg_advisory_xact_lock的组合)
  • 您可能希望实现一个选项来停止/启动任务,以及通过Loopback API / Loopback Explorer查看其状态。我们在Loopback中制作了一些自定义API方法来完成它并发现它非常有用

我的问题是我在Loopback 4 API中应该在何处以及如何实现此代码?

所以,答案是继续并以你提出的方式实施它。您可以在自定义引导程序中初始化任务。您还应该根据您的业务需求考虑我上面提到的要点。


0
投票

这个解决方案对我有用。

Installation

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

Create a component

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

Using Loopback DI Container to get a controller instance:

// 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

© www.soinside.com 2019 - 2024. All rights reserved.