在nodejs中实现调度任务

在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.rhkb.cn/news/160109.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言从入门到实战——C语言数据类型和变量

C语言数据类型和变量 前言1. 数据类型介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof中表达式不计算 2. signed 和 unsigned3. 数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5. 算术操作符&…

vueday01——ref响应式

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

多维时序 | MATLAB实现SSA-CNN-BiLSTM-Attention多变量时间序列预测(SE注意力机制)

多维时序 | MATLAB实现SSA-CNN-BiLSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09; 目录 多维时序 | MATLAB实现SSA-CNN-BiLSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基…

C++项目实战——基于多设计模式下的同步异步日志系统-⑪-日志器管理类与全局建造者类设计(单例模式)

文章目录 专栏导读日志器建造者类完善单例日志器管理类设计思想单例日志器管理类设计全局建造者类设计日志器类、建造者类整理日志器管理类测试 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计…

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

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

《机器人学导论》——探究未来世界的奇妙之旅

你是否感到生活变得越来越便利、智能&#xff1f;是的&#xff0c;这些都与机器人技术的发展密不可分。而想要更深入地了解机器人技术&#xff0c;一本好的书籍是必不可少的。那么&#xff0c;今天作者要向大家推荐的就是这样一本优秀的机器人学大作——《机器人学导论》。 《…

JUC并发编程——JUC并发编程概述及Lock锁(重点)(基于狂神说的学习笔记)

基于bilibili狂神说JUC并发编程视频所做笔记 概述 什么是JUC JUC时java.util工具包中的三个包的简称 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 业务&#xff1a;普通的线程代码中&#xff0c;我们常使用Runnable接口 但Runnable没有返…

ElasticSearch-数据查询

ElasticSearch-数据查询 目录概述需求&#xff1a; 设计思路实现思路分析1.查询某索引下的所有数据2.二、条件查询3.、条件查询方式二4.四、分页查询5.五、格式化数据 六、排序七 其他条件执行的成立的查询九、范围查询 参考资料和推荐阅读 Survive by day and develop by nigh…

基于类电磁机制优化的BP神经网络(分类应用) - 附代码

基于类电磁机制优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于类电磁机制优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.类电磁机制优化BP神经网络3.1 BP神经网络参数设置3.2 类电磁机制算法应用 4…

使用Premiere、PhotoShop和Audition做视频特效

今天接到一个做视频的任务&#xff0c;给一个精忠报国的视频&#xff0c;要求&#xff1a;   ①去掉人声&#xff0c;就是将唱歌的人声去掉&#xff0c;只留下伴奏&#xff1b;   ②截图视频中的横幅&#xff0c;做一个展开的效果&#xff0c;类似卷纸慢慢展开&#xff1b;…

使用 Tkinter Canvas 小部件添加放大镜功能?

一、说明 据我所知&#xff0c;内置的 Tkinter Canvas 类比例不会自动缩放图像。如果您无法使用自定义小部件&#xff0c;则可以缩放原始图像并在调用缩放函数时将其替换在画布上。 二、实现图像放大镜技术细节 我如何将放大和缩小添加到以下脚本中&#xff0c;我想将其绑定到…

【狂神说】HTML详解

目录 1 HTML概述1.1 什么是HTML1.2 HTML发展史1.3 HTML5的优势1.4 W3C标准 2 网页2.1 网页基本信息2.2 网页基本标签2.2.1 标题标签2.2.2 段落标签2.2.3 换行标签2.2.4 水平线标签2.2.5 字体样式标签&#xff1a;粗体、斜体2.2.6 注释和特殊符号 2.3 图像标签2.4 链接标签邮箱链…

高质量床上用品类网站带手机端的pbootcms模板

模板介绍&#xff1a; 这是一个基于PbootCMS内核开发的床上用品类网站模板&#xff0c;专为床上用品、家用纺织类企业设计和开发。它不仅提供了网站界面简洁简单、易于管理的特点&#xff0c;还附带了测试数据&#xff0c;方便用户进行演示和学习。 模板特点&#xff1a; 采用…

【TES720D-KIT】青翼自研基于复旦微FMQL20S400全国产化ARM开发套件(核心板+底板)

TES720D-KIT是专门针对我司TES720D&#xff08;基于复旦微FMQL20S400的全国产化ARM核心板&#xff09;的一套开发套件&#xff0c;它包含1个TES720D核心板&#xff0c;加上一个TES720D-EXT扩展底板。 FMQL20S400是复旦微电子研制的全可编程融合芯片&#xff0c;在单芯片内集成…

HTTP 原理与CND原理

1 HTTP 原理 HTTP是一个无状态的协议。无状态是指客户机&#xff08;Web浏览器&#xff09;和服务器之间不需要建立持久的连接&#xff0c;这意味着当一个客户端向服务器端发出请求&#xff0c;然后服务器返回响应(response)&#xff0c;连接就被关闭了&#xff0c;在服务器端…

与HTTP相关的各种协议

TCP/IP TCP/IP协议是目前网络世界“事实上”的标准通信协议&#xff0c;实际上是一系列网络通信协议的统称&#xff0c;其中最核心的两个协议是 TCP和IP&#xff0c;其他的还有 UDP、ICMP、ARP 等等&#xff0c;共同构成了一个复杂但有层次的协议栈。 这个协议栈有四层&#x…

前端需要了解的浏览器缓存知识

文章目录 前言为什么需要缓存&#xff1f;DNS缓存缓存读写顺序缓存位置memory cache&#xff08;浏览器本地缓存&#xff09;disk cache&#xff08;硬盘缓存&#xff09;重点&#xff01;&#xff01;&#xff01; 缓存策略 - 强缓存和协商缓存1&#xff09;强缓存ExpiresCach…

城市生命线专题周丨宏电燃气管线智慧化运营解决方案,助力燃气安全运营高质量发展

方案背景 随着我国城市发展建设速度的加快和国家能源结构的调整&#xff0c;天燃气走进了千家万户&#xff0c;燃气门站和城市燃气管网规模越来越庞大。此外&#xff0c;近年燃气泄漏导致的大型爆炸事件频发&#xff0c;给人民的生命安全和财产安全带来灾难性伤害。 行业痛点 …

Android---Android 是如何通过 Activity 进行交互的

相信对于 Android 工程师来说&#xff0c;startActivity 就像初恋一般。要求低&#xff0c;见效快&#xff0c;是每一个菜鸟 Android 工程师迈向高级 Android 工程师的必经阶段。经过这么多年的发展&#xff0c;startActivity 在 google 的调教下已经变得愈发成熟&#xff0c;对…

浅析ArkTS的起源和演进

1 引言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力&#xff0c;到具备类型系统的高效工程开发能力&#xff0c;再到融合声明式UI、多维状态管理等丰富的应用开发能力&#xff0c;共同组成了相关的演进脉…