经常发文章的你是否想过定时发布是咋实现的?

news2024/11/27 17:39:40

前言

可乐他们团队最近在做一个文章社区平台,由于人手不够,前后端都是由前端同学来写。后端使用 nest 来实现。

某一天周五下午,可乐正在快乐摸鱼,想到周末即将来临,十分开心。然而,产品突然找到了他,说道:可乐,我们要做一个文章定时发布功能。

现在我先为你解释一下这个功能里意义:定时发布功能赋予了作者更大的灵活性和自由度,他们可以提前准备好文章,然后在适当的时机发布,而不必在发布当天临时抓紧时间编辑和发布。

由于上次你做一个点赞做了五天,各个老板已经颇有微词,这个功能你别再搞幺蛾子,周一要提测,你自己把控好时间。

说罢,产品就走了。

可乐挠了挠头,本来想以普通人的身份跟你们相处。结果换来的却是疏远,今天我就给你露一手,半天使用 Nest+React 实现一下文章的定时发布功能。

往期文章

仓库地址

  • 切图仔做全栈:React&Nest.js 社区平台(一)——基础架构与邮箱注册、JWT 登录实现
  • 切图仔做全栈:React&Nest.js社区平台(二)——👋手把手实现优雅的鉴权机制
  • React&Nest.js全栈社区平台(三)——🐘对象存储是什么?为什么要用它?
  • React&Nest.js社区平台(四)——✏️文章发布与管理实战
  • React&Nest.js全栈社区平台(五)——👋封装通用分页Service实现文章流与详情
  • 领导问我:为什么一个点赞功能你做了五天?
  • 🤔️测试问我:为啥阅读量计数这么简单的功能你都能写出bug?

Cron表达式

Cron 表达式是一种时间表达式,通常用于在计算机系统中指定定时任务的执行时间。它是由特定的格式和字段组成的字符串,用来表示任务在何时执行。

Cron 表达式一般由六个或七个字段组成,每个字段表示任务执行的一个时间单位。这些字段的含义通常如下:

  1. 秒(Seconds): 表示分钟的秒数,取值范围为 0~59
  2. 分钟(Minutes): 表示小时的分钟数,取值范围为 0~59
  3. 小时(Hours): 表示一天中的小时数,取值范围为 0~23
  4. 日期(Day of month): 表示一个月中的哪一天,取值范围为 1~31
  5. 月份(Month): 表示一年中的哪个月份,取值范围为 1~12 ,也可以使用缩写形式如 JAN, FEB 等。
  6. 星期(Day of week): 表示一周中的哪一天,取值范围为 0~7(0 和 7 都代表周日) ,也可以使用缩写形式如 SUN, MON 等。
  7. 年(Year): 可选字段,表示哪一年,取值范围为 19702099

Cron 表达式中,可以使用数字、星号 *、逗号 ,、斜杠 /、连字符 - 等符号来表示不同的时间段和重复规则。例如:

  • * 表示匹配所有可能的值。
  • 5 表示具体的一个值。
  • 1,2,3 表示多个值。
  • */5 表示每隔一定时间执行一次。
  • 10-20 表示一个范围内的值。

举例如下:

  • 0/20 * * * * ?   表示每20秒执行一次
  • 0 0 2 1 * ?   表示在每月的1日的凌晨2点执行
  • 0 0 10,14,16 * * ?   每天上午10点,下午2点,4点执行
  • 0 0 12 ? * WED    表示每个星期三中午12点执行
  • 0 0 12 * * ?   每天中午12点执行

Nest中的定时调度

nest 中,定时任务的注册与触发可以使用 @nestjs/schedule 这个库,它提供了一种装饰器注册定时任务的方式,接入与使用都十分方便。

首先在 app.module.ts 中注册 schedule 这个模块

@Module({
   
  imports: [
    ScheduleModule.forRoot(),
  ],
})
export class AppModule {
    }

然后在 service 中使用 @Cron 装饰器就可以注册定时任务了:

  @Cron('*/3 * * * * *') // 每 3 秒钟执行一次
  async handle() {
   
    console.log('Called every 3 seconds article service');
  }

@nestjs/schedule 在这个过程中需要做的事情是,通过装饰器收集到每个定时任务的执行器(即上面的 handle 方法)以及每个定时任务的触发时机,即上述的 cron 表达式。

而真正调度定时任务的逻辑其实不在 @nestjs/schedule 中处理, @nestjs/schedule 收集到触发时机以及执行器之后,会把它们交给 node-cron 这个库进行处理。

image.png

上述代码是 @nestjs/schedule 的源码,它收集到 nest 项目中注册的定时任务信息后,会调用 node-cron 中的 CronJob 来创建一个定时任务。

其中 options 就是包含了 cron 表达式在内的定时任务配置信息; target 就是需要执行的逻辑,比如上述的 handle 方法。

image.png

创建完 Cron 实例之后,核心调度的代码在 start 方法中,大致贴一下这个方法的代码:

start() {
   
  if (this.running) {
   
    return;
  }

  const MAXDELAY = 2147483647; // The maximum number of milliseconds setTimeout will wait.
  let timeout = this.cronTime.getTimeout();
  let remaining = 0;
  let startTime: number;

  const setCronTimeout = (t: 

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

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

相关文章

已经做了小20年电商梦的腾讯,终于找到了破局的方向~

我是王路飞。 随着短视频的爆火、抖音电商成功开辟出短视频/直播带货的电商新赛道。 已经做了小20年电商梦的腾讯,终于找到了破局的方向~ 这个方向,就是被腾讯马老板亲口认证为:全村(全公司)希望所在的视频号。 内…

Python-100-Days: Day11 Files and Exception

1.读取csv文件 读取文本文件时,需要在使用open函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为r(如果不指定,默认值也是r),然后通过encoding参数指定编码&#xf…

基于FPGA的DDS波形发生器VHDL代码Quartus仿真

名称:基于FPGA的DDS波形发生器VHDL代码Quartus仿真(文末获取) 软件:Quartus 语言:VHDL 代码功能: DDS波形发生器VHDL 1、可以输出正弦波、方波、三角波 2、可以控制输出波形的频率 DDS波形发生器原理…

手撸Mybatis(五)——连接数据库进行insert,update和delete

本专栏的源码:https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 引言 在上一章中,我们成功实现了数据库的连接,以及单个字段的查询、resultType映射查询、resultMap映射查询。在本章,我们将讲解关于增加、修改和删除操作。 …

【MATLAB源码-第204期】基于matlab的语音降噪算法对比仿真,谱减法、维纳滤波法、自适应滤波法;参数可调。

操作环境: MATLAB 2022a 1、算法描述 语音降噪技术的目的是改善语音信号的质量,通过减少或消除背景噪声,使得语音更清晰,便于听者理解或进一步的语音处理任务,如语音识别和语音通讯。在许多实际应用中,如…

MySQL45讲(一)(40)

回顾binlog_formatstatement STATEMENT 记录SQL语句。日志文件小,节约IO,但是对一些系统函数不能准确复制或不能复制,如now()、uuid()等 在RR隔离级别下,binlog_formatstatement 如果执行insert select from 这条语句是对于一张…

动态规划算法:简单多状态问题

例题一 解法(动态规划): 算法思路: 1. 状态表⽰: 对于简单的线性 dp ,我们可以⽤「经验 题⽬要求」来定义状态表⽰: i. 以某个位置为结尾,巴拉巴拉; ii. 以某个位置为起…

通过高效的升级计划控制云成本

快速迁移到云以及使用和成本的复杂性使得公司迫切希望减少浪费并控制其支出。更糟糕的是,动荡的经济让决策者紧张不安,他们考虑削减成本措施并优先考虑锁定收入。 如果没有正式的 FinOps 或成本优化策略,公司很容易看到云费用如滚雪球般失控…

一键解密,网络安全神器现已问世!

一、简介 当前版本V1.1这款工具是一款功能强大的网络安全综合工具,旨在为安全从业者、红蓝对抗人员和网络安全爱好者提供全面的网络安全解决方案。它集成了多种实用功能,包括解密、分析、扫描、溯源等,为用户提供了便捷的操作界面和丰富的功…

UDP多播

1 、多播的概念 多播,也被称为组播,是一种网络通信模式,其中数据的传输和接收仅在同一组内进行。多播具有以下特点: 多播地址标识一组接口:多播使用特定的多播地址,该地址标识一组接收数据的接口。发送到多…

现场面试题

这里写目录标题 1.sql1.1 只保留学生的最新成绩1.2 统计通话号码数1.3 更新地址 2.基础题2.1 请求序列第N位的值: 0, 1, 1, 2, ,3, 5, 8, 13, 21, 34.....第N位的值2.2 请写一段java代码,输出存在重复字母的单词 1.sql 1.1 只保留学生的最新成绩 表student中记录学…

每日一题(PTAL2):列车调度--贪心+二分

选择去维护一个最小区间 代码1&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;int num;vector <int> v;int res0;for(int i0;i<n;i){cin>>num;int locv.size();int left0;int rightv.size()-1;while(left<…

C++变量的作用域与存储类型

一 变量的作用域和存储类型 1 变量的作用域(Scope) 指在源程序中定义变量的位置及其能被读写访问的范围分为局部变量(Local Variable)和全局变量(Global Variable) 1&#xff09;局部变量(Local Variable) 在语句块内定义的变量 形参也是局部变量 特点&#xff1a; 生存期是…

AIGC-3D数字人技术:高效助推各行业数字化水平升级

从“互联网”到“人工智能”&#xff0c;数字员工作为一种全新的交互形式&#xff0c;对企业有着重要的作用&#xff0c;企业、品牌通过数字人的AI语音交互、AI播报等核心功能&#xff0c;可以有效推动企业提升数字水平。 作为3D、AI虚拟数字人技术服务商及方案提供商&#xff…

为什么都喜欢用串口通讯?那为什么还用RS485,SPI和I2C?

1、为什么都喜欢用串口通讯&#xff1f; 之前在做单片机产品的时候&#xff0c;用的最多的就是串口通讯&#xff0c;凡是单片机的外设&#xff0c;优先选用带串口功能的&#xff0c;比如蓝牙模块&#xff0c;WIFI模块&#xff0c;4G模块&#xff0c;电表和显示屏等等。 为什么都…

科研学习|可视化——ggplot2版本的网络可视化

ggplot2是R语言中一个非常流行的数据可视化包&#xff0c;它也可以用于网络可视化。以下是三个基于ggplot2并专门用于网络可视化的R包&#xff1a; ggnet2: 这个包的使用方法与传统的plot函数相似&#xff0c;易于使用。更多信息可在其官方页面查看&#xff1a;ggnet2 geomnet…

KUKA机器人故障报警信息处理(一)

1、KSS00276 机器人参数不等于机器人类型 ①登录专家模式 ②示教器操作&#xff1a;【菜单】—【显示】—【变量】—【单个】 ③名称输入&#xff1a;$ROBTRAFO[] 新值&#xff1a;TRAFONAME[] ④点击【设定值】。 2、电池报警&#xff1a; ①“充电电池警告-发现老化的蓄电池…

【管理咨询宝藏93】大型制造集团数字化转型设计方案

【管理咨询宝藏93】大型制造集团数字化转型设计方案 【格式】PDF版本 【关键词】国际咨询公司、制造型企业转型、数字化转型 【核心观点】 - 235页大型制造型集团数字化转型方案设计&#xff01;细节非常详尽&#xff0c;图表丰富&#xff01; - 系统架构必须采用成熟、具有国…

Mybatis进阶4-权限管理

权限管理 1.权限 //相当于 职责 2.用户 //相当于 职员&#xff08;职员就职于一个职位&#xff09; 3.角色 //相当于 职位&#xff08;有多个职责&#xff09; 权限管理基础表&#xff1a;权限表&#xff0c;用户表&#xff0c;角色表 问题1&#xff1a;…

雷蛇笔记本数据丢失怎么恢复?提供详细指南

在数字化时代&#xff0c;笔记本电脑已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;尽管技术不断进步&#xff0c;数据丢失的风险仍然存在。雷蛇&#xff08;Razer&#xff09;作为一家知名的电脑硬件制造商&#xff0c;其笔记本电脑也难免会遇到这样的问题。当…