Loopback 4 cron/定时任务
Loopback 4 cron / scheduled tasks
我想 运行 为我的 Loopback 4 API 安排任务。我可以使用 node-cron 或 node-schedule 等软件包轻松地使用 node 设置计划任务。
我的问题是我应该在 Loopback 4 中的何处以及如何实现此代码 API?
我的想法是编写一个自定义引导程序,它将在环回 API "boots" 时发现并 运行 cron 逻辑。但是不确定我是否在这里走正确的道路。
https://loopback.io/doc/en/lb4/Booting-an-Application.html#custom-booters
我们有完全相同的任务并按照您描述的方式完成,即我们在启动脚本中初始化基于 cron 的任务。效果很好。
在 Node.js 中执行任务时可能需要考虑一些事项:
- 如果您计划 运行 您的 Node 应用程序的多个实例(例如使用 pm2 或其他),您可能需要确保您的任务仅 运行 在一个主节点上而不是然后同时在所有节点上。如果主节点发生故障,则必须选择下一个节点作为新的主节点。根据业务逻辑,在您的情况下这可能不是问题。在我们的例子中,它是强制性的,我们设法在 PG 中使用咨询锁来实现它(我们使用 pg_try_advisory_xact_lock 和 pg_advisory_xact_lock 的组合)
- 您可能想要实现 stop/start 任务的选项以及通过环回 API/Loopback 资源管理器查看其状态。我们在 Loopback 中制作了一些自定义的 API 方法来做到这一点,并发现它非常有用
My question is where and how should I implement this code within my
Loopback 4 API?
所以,答案是继续并按照您建议的方式实施。您可以在自定义引导程序中初始化您的任务。您还应该根据您的业务需求考虑我上面提到的几点。
这个解决方案对我有用。
安装
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');
});
}
}
使用环回 DI 容器获取控制器实例:
// 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
我想 运行 为我的 Loopback 4 API 安排任务。我可以使用 node-cron 或 node-schedule 等软件包轻松地使用 node 设置计划任务。
我的问题是我应该在 Loopback 4 中的何处以及如何实现此代码 API?
我的想法是编写一个自定义引导程序,它将在环回 API "boots" 时发现并 运行 cron 逻辑。但是不确定我是否在这里走正确的道路。 https://loopback.io/doc/en/lb4/Booting-an-Application.html#custom-booters
我们有完全相同的任务并按照您描述的方式完成,即我们在启动脚本中初始化基于 cron 的任务。效果很好。
在 Node.js 中执行任务时可能需要考虑一些事项:
- 如果您计划 运行 您的 Node 应用程序的多个实例(例如使用 pm2 或其他),您可能需要确保您的任务仅 运行 在一个主节点上而不是然后同时在所有节点上。如果主节点发生故障,则必须选择下一个节点作为新的主节点。根据业务逻辑,在您的情况下这可能不是问题。在我们的例子中,它是强制性的,我们设法在 PG 中使用咨询锁来实现它(我们使用 pg_try_advisory_xact_lock 和 pg_advisory_xact_lock 的组合)
- 您可能想要实现 stop/start 任务的选项以及通过环回 API/Loopback 资源管理器查看其状态。我们在 Loopback 中制作了一些自定义的 API 方法来做到这一点,并发现它非常有用
My question is where and how should I implement this code within my Loopback 4 API?
所以,答案是继续并按照您建议的方式实施。您可以在自定义引导程序中初始化您的任务。您还应该根据您的业务需求考虑我上面提到的几点。
这个解决方案对我有用。
安装
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');
});
}
}
使用环回 DI 容器获取控制器实例:
// 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