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

2024-05-08 00:12

本文主要是介绍经常发文章的你是否想过定时发布是咋实现的?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

可乐他们团队最近在做一个文章社区平台,由于人手不够,前后端都是由前端同学来写。后端使用 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.chinasem.cn/article/968786

相关文章

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我