在nodejs中实现调度任务

news2025/1/12 21:47:04

在nodejs中实现调度任务

node.js帮助开发人员简化了工作流程,创建了高效的应用程序。它的许多有用功能之一是任务调度。本文将探讨在nodejs中调度任务的重要性、各种使用第三方库的代码示例,以及需要遵循的一些有用的操作。

为什么我们需要安排任务

调度任务对于确保某些事件在特定时间或间隔发生、重复过程自动化和有效管理资源至关重要。

nodejs中,调度任务允许开发人员:

  1. 执行时间敏感的操作,例如发送提醒或通知。
  2. 自动更新数据或定期生成报表。
  3. 管理长期运行的流程,而不影响应用程序的总体性能。
  4. 平衡工作量和优化资源使用。

用例

一些常见的节点调度任务用例包括:

  • 电子邮件和短信通知:在预定时间向用户发送提醒或警报。
  • 数据备份和同步:在多个数据库中执行常规备份或同步数据。
  • 报告生成:每隔一段时间生成报告或分析数据用于监控或者商业分析。
  • 系统维护:运行日常维护任务,如数据库清理、缓存失效或日志旋转。
  • 其他:以动态和独立的方式运行任何我们想要的任务。

使用三方库的代码示例

Agenda

Agenda是一个受欢迎的、轻量级的工作计划库。 与MongoDB结合可以实现数据长期缓存。 .

在这里插入图片描述
让我们来探索如何使用Agenda来在一个nodejs应用程序中安排任务。

Agenda是一个灵活而强大的工作调度库,它简化了计划任务的创建、管理和执行过程。其一些主要特点包括:

  • 持久性:Agenda使用`MongoDB作为后端存储作业数据,确保计划的任务不会在服务器重新启动或崩溃时丢失。这提供了一种基于内存的调度程序通常缺乏的故障容忍度和一致性水平。
  • 事件驱动架构:Agenda提供了一个基于事件的API,用于处理工作完成、失败或成功等工作事件。这使得开发人员很容易对各种作业状态作出反应,并相应地实现自定义逻辑。
  • 工作并发和锁定:Agenda允许我们控制工作执行的并发性,确保同一工作的多个实例不会同时运行。在处理需要独家访问共享资源的任务时,这一点特别有用。
  • 灵活调度:Agenda支持各种调度选项,包括一次性任务、固定时间间隔的经常性任务,以及更复杂的调度需求的计算机式表达式。
  • 工作优先级:Agenda允许我们设定工作的优先级,确保更重要的任务在不那么重要的任务之前执行。这可以通过确定重要任务的优先次序来帮助提高应用程序的总体性能。
  • 重试和失败处理:Agenda支持可配置的重试策略,包括对失败的任务处理。这使我们能够优雅地处理工作失败并提高应用程序的可靠性。
  • 插件支持::Agenda可以与其他库相结合,比如Moment.js。这将确保无论服务器位置或不同时区时间的变化,我们的预定任务都能准确执行。
  • 中间件集成:可以很容易地将Agenda集成到现有的nodejs应用程序中,例如expresskoa,这样我们就可以无缝地与其他应用程序组件一起管理预定任务。

首先,安装Agenda及其对MongoDB数据库的依赖:

npm install agenda mongodb

接下来,创建一个新文件agendaJobs.js 和制定任务:

const Agenda = require('agenda');
const MongoClient = require('mongodb').MongoClient;

const connectionString = 'mongodb://localhost/agenda';

(async function() {
  const client = await MongoClient.connect(connectionString, { useNewUrlParser: true, useUnifiedTopology: true });
  const agenda = new Agenda({ mongo: client.db('agenda') });
  // 定义任务
  agenda.define('send email', async (job, done) => {
    console.log('Sending email...');
    done();
  });
  // 调度任务
  await agenda.start();
  agenda.every('1 hour', 'send email');
})();

在上面的例子中,我们定义了一个发送电子邮件的任务,并安排它每小时运行一次。我们可以根据自己的需求来替换电子邮件发送逻辑。

node-cron

另一个很受欢迎的库是node-cron。.它允许我们使用熟悉的cron语法来创建cron任务,从而使在特定的间隔或时间安排任务变得容易。

在这里插入图片描述

首先,安装node-cron

npm install node-cron

接下来,创建一个新文件cronJobs.js 以及配置node-cron

const cron = require('node-cron');

// 定义任务
const sendEmail = () => {
  console.log('Sending email...');
};
// 任务调度
const job = cron.schedule('0 8 * * *', sendEmail, {
  scheduled: false,
  timezone: 'Asia/Jerusalem',
});
// 开始任务
job.start();

在这个例子中,我们定义了一个叫做sendEmail的任务,包含我们的电子邮件发送逻辑。我们就用node-cron 根据亚洲时区的数据,将这一功能安排在每天上午8时运行。

node-cron对于熟悉cron语法的开发人员来说,它是一个很好的库,因为它提供了一个简单而直观的API,用于在nodejs中调度任务。它对自定义时差和各种调度选项的支持使它成为各种用例的通用选择。

Bull

另一个用于安排任务的有用库是Bull。它是一个功能强大的快速作业队列库,使用redis来实现持久性的数据缓存以及工作管理。它允许我们以分布式和可伸缩的方式创建、安排和处理作业。

在这里插入图片描述

这里有一个例子,说明如何使用Bull来安排每天早上8点发送邮件的任务。

首先,安装Bullioredis

npm install bull ioredis

接下来,创建一个新文件bullJobs.js 以及配置Bul

const Bull = require('bull');
const { setQueues, UI } = require('bull-board');
const Redis = require('ioredis');
const express = require('express');

const emailQueue = new Bull('emailQueue', {
  createClient: () => new Redis(),
});

// 定义任务
emailQueue.process(async (job) => {
  console.log('Sending email...');
});

// 任务调度
const scheduleEmail = async () => {
  await emailQueue.add(
    {},
    { repeat: { cron: '0 8 * * *', tz: 'Asia/Jerusalem' } }
  );
};

scheduleEmail();

// 配置bull
const app = express();
setQueues([emailQueue]);
app.use('/admin/queue', UI);
app.listen(3000, () => console.log('Bull board listening on port 3000'));

在本例中,我们首先创建了一个emailQueue队列。然后定义包含我们的电子邮件发送逻辑的任务。我们使用add 方法来安排任务,提供一个空对象作为任务数据。

另外,我们还建立了Bull Board,一个简单的仪表板来监控和管理牛的队列。我们创建了一个快速应用程序,设置了Bull中间件,并开始监听端口3000。

Bull是一个强大而灵活的库,它提供了高级功能,如工作优先排序、并发性控制、速率限制等。它对`REDIS端的支持确保了高性能和持久性,使其适合于分布式和可伸缩系统中的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1099630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#创作纪念日#我的256天创作纪念日

我的创作256天纪念日 机缘收获日常成就憧憬 机缘 机缘……好像128天的时候已经写过了…… 小升初时,我开始接触编程,进入了一个全新的世界。刚开始学习编程时,我只是对电脑的一些操作比较感兴趣,但慢慢地,我开始对编…

模式植物GO背景基因集制作

一边学习,一边总结,一边分享! 写在前面 关于GO背景基因集文件的制作,我们在很早以前也发过。近两天,自己在分析时候,也是被搞了头疼。想重新制作一份GO背景基因集,进行富集分析。但是结果&…

vueday01——ref响应式

特性&#xff1a;持续监控某个响应式变量的属性名变化&#xff0c;可以使用shallowRef来取消这一特性&#xff0c;只监控对象整体的变化 ref测试代码&#xff1a; <template><div :id"idValue" ref"myDiv">打印obj{{ obj }}</div><…

大数据Flink(九十七):EXPLAIN、USE和SHOW 子句

文章目录 EXPLAIN、USE和SHOW 子句 一、EXPLAIN 子句 二、USE 子句

QQd挂源码已更新最新加速项目程序全开源

1、99 公益日活动加速任务已全部完成适配&#xff0c;空间公益说说和评论并分享小世界内容任务在已有的功能上进行挂机&#xff0c; 其中【发小世界】功能暂时更名为【公益小世界】。 2、上线新功能【公益答题】用于完成参加 Qbox 公益答题任务&#xff0c;等级套装有任意一项…

期中考Web复现

第一题 1z_php <?php //Yeedo told you to study hard! echo !(!(!(!(include "flag.php")||(!error_reporting(0))||!isset($_GET[OoO])||!isset($_GET[0o0])||($_GET[OoO]2023)||!(intval($_GET[OoO][0])2023)||$_GET[0o0]$_GET[OoO]||!(md5($_GET[0o0])md5($_…

Java Static

Static 变量被 static 修饰 static 修饰的变量在类中只有一份&#xff0c;可以称为类变量&#xff0c;其他变量称为实例变量在方法区加载类的时候&#xff0c;会检查类中是否存在静态变量&#xff0c;如果存在则会在堆内存区域开辟一块空间用于存储静态变量。方法区中的静态变…

A114-经典赛题-Web应用程序文件包含安全攻防

实验步骤: Web应用程序文件包含安全攻防 任务环境说明&#xff1a; 服务器场景&#xff1a;WebServ2003&#xff08;用户名&#xff1a;administrator&#xff1b;密码&#xff1a;空&#xff09; 服务器场景操作系统&#xff1a;Microsoft Windows2003 Server 服务器场景…

IPv6知识概述 - ND协议

IPv6知识概述 - ND协议 参考文章&#xff1a;https://blog.csdn.net/Gina_wj/article/details/106708770 IPv6基础篇&#xff08;四&#xff09;&#xff1a;邻居发现协议NDP ND协议功能概述 ND&#xff08;Neighbor Discovery&#xff0c;邻居发现&#xff09;协议是IPv6的…

01【Git的基本使用与底层原理】

下一篇&#xff1a;02【Git的分支与数据恢复】 目录&#xff1a;【Git系列教程-目录大纲】 文章目录 一、Git概述1.1 Git简介1.2 集中式与分布式1.2.1 集中式版本控制1.2.2 分布式版本控制 1.3 Git的使用流程1.3.1 本地仓库1.3.2 协同开发 1.4 Git的配置1.4.1 Git的配置等级1…

从头开始机器学习:线性回归

从头开始机器学习&#xff1a;线性回归 跟随 16 分钟阅读 28月 <> 1 一、说明 本篇实现线性回归的先决知识是&#xff1a;基本线性代数&#xff0c;微积分&#xff08;偏导数&#xff09;、梯度和、Python &#xff08;NumPy&#xff09;&#xff1b;从线性方程入手。 代…

【LeetCode刷题(数据结构与算法)】:用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头…

运维 | 如何在 Linux 系统中删除软链接 | Linux

运维 | 如何在 Linux 系统中删除软链接 | Linux 介绍 在 Linux 中&#xff0c;符号链接&#xff08;symbolic link&#xff0c;或者symlink&#xff09;也称为软链接&#xff0c;是一种特殊类型的文件&#xff0c;用作指向另一个文件的快捷方式。 使用方法 我们可以使用 ln…

双目标定之张正友标定法数学原理详解matlab版

目录 前言 1.相机标定 1.1 双目视觉基本原理 1. 2 相机的四个坐标系 1.3 相机畸变与校正 2.1 相机标定 张正友友棋盘格标定法在matlab的实现 这一篇主要详细介绍标定原理和相机各个坐标系之间的关系为后续的定位测距和重建做基础 前言 最近重新整理了一下自己做过的双目…

【单片机基础】使用51单片机制作函数信号发生器(DAC0832使用仿真)

文章目录 &#xff08;1&#xff09;DA转换&#xff08;2&#xff09;DAC0832简介&#xff08;3&#xff09;电路设计&#xff08;4&#xff09;参考例程&#xff08;5&#xff09;参考文献 &#xff08;1&#xff09;DA转换 单片机作为一个数字电路系统&#xff0c;当需要采集…

ICML2021 | RSD: 一种基于几何距离的可迁移回归表征学习方法

目录 引言动机分析主角&#xff08;Principal Angle&#xff09;表征子空间距离正交基错配惩罚可迁移表征学习实验数据集介绍 实验结果总结与展望 论文链接 相关代码已经开源 引言 深度学习的成功依赖大规模的标记数据&#xff0c;然而人工标注数据的代价巨大。域自适应&…

10种新型网络安全威胁和攻击手法

2023年&#xff0c;网络威胁领域呈现出一些新的发展趋势&#xff0c;攻击类型趋于多样化&#xff0c;例如&#xff1a;从MOVEit攻击可以看出勒索攻击者开始抛弃基于加密的勒索软件&#xff0c;转向窃取数据进行勒索&#xff1b;同时&#xff0c;攻击者们还减少了对传统恶意软件…

android U广播详解(二)

android U广播详解&#xff08;一&#xff09; 基础代码介绍 广播相关 // 用作单个进程批量分发receivers&#xff0c;已被丢弃 frameworks/base/services/core/java/com/android/server/am/BroadcastReceiverBatch.java // 主要逻辑所在类&#xff0c;包括入队、分发、结束…

Spacedrive:开源跨平台文件管理 | 开源日报 No.57

denoland/deno Stars: 91.2k License: MIT Deno 是一个简单、现代和安全的 JavaScript 和 TypeScript 运行时&#xff0c;使用 V8 引擎并用 Rust 构建。其主要功能包括&#xff1a; 默认情况下具有高度安全性&#xff0c;除非显式启用&#xff0c;否则无法访问文件、网络或环…

docker入门加实战—网络

docker入门加实战—网络 我们运行了一些容器&#xff0c;但是这些容器是否能够进行连通呢&#xff1f;那我们就来试一下。 我们查看一下MySQL容器的详细信息&#xff1a; 主要关注&#xff0c;Networks.bridge.IPAddress属性信息&#xff1a; docker inspect mysql # 或者过…