【问题标题】:Loopback 4 cron / scheduled tasks环回 4 cron / 计划任务
【发布时间】:2019-08-22 04:41:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: node.js loopbackjs loopback


    【解决方案1】:

    我们有完全相同的任务,并按照您描述的方式进行,即我们在引导脚本中初始化基于 cron 的任务。效果很好。

    在 Node.js 中执行任务时可能需要考虑一些事项:

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

    我的问题是我应该在哪里以及如何在我的 环回 4 API?

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

    【讨论】:

      【解决方案2】:

      这个解决方案对我有用。

      安装

      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

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 2011-12-18
        • 1970-01-01
        相关资源
        最近更新 更多