GO CronGin

news/2024/9/20 5:35:12 标签: golang, gin, 开发语言, cron, go

文章目录

      • Robfig Cron介绍
        • 1. **安装 `robfig/cron`**
        • 2. **基本用法**
        • 示例:创建一个简单的定时任务
        • 3. **Cron 表达式**
        • 常用的 Cron 表达式示例:
        • 4. **添加和管理任务**
        • 5. **上下文支持**
        • 6. **使用场景**
        • 7. **高级用法**
        • 总结
      • Cron 在Gin中实践使用
        • 1. **安装 `robfig/cron`**
        • 2. **封装定时任务**
        • `cronjob.go` - 封装定时任务
        • 3. **在 `Gin` 项目中使用定时任务**
        • `main.go` - 在 `Gin` 中使用封装的定时任务
        • 4. **代码说明**
        • 5. **运行项目**

Robfig Cron介绍

robfig/cron 是 Go 中一个常用的定时任务库,提供了类似于 Unix cron 表达式的调度功能。可以使用它来执行定时任务,例如每天备份数据库、定期发送报告等。以下是对 robfig/cron 的学习和常见使用场景。

cron_6">1. 安装 robfig/cron

首先,确保在项目中安装了 robfig/cron

go get github.com/robfig/cron/v3
2. 基本用法

使用 robfig/cron 来创建和管理定时任务非常简单。下面是一些基本的使用步骤和示例代码:

示例:创建一个简单的定时任务
go">package main

import (
	"fmt"
	"time"

	"github.com/robfig/cron/v3"
)

func main() {
	// 创建一个新的 Cron 调度器
	c := cron.New()

	// 添加一个定时任务:每秒执行一次
	c.AddFunc("* * * * * *", func() {
		fmt.Println("Task running at", time.Now())
	})

	// 启动调度器
	c.Start()

	// 让主程序运行,等待定时任务执行
	select {} // 阻塞主 goroutine
}

在这个示例中,AddFunc 方法将一个匿名函数添加到调度器中,该函数将在每秒钟运行一次。cron.New() 创建一个新的调度器实例,c.Start() 启动它。

3. Cron 表达式

robfig/cron 使用一种类 Unix 的 cron 表达式来定义任务的调度时间。标准格式为:

秒 分 时 日 月 星期
  • 秒 (0-59)
  • 分 (0-59)
  • 时 (0-23)
  • 日 (1-31)
  • 月 (1-12)
  • 星期 (0-6) (星期天=0)
常用的 Cron 表达式示例:
  • "0 * * * * *":每分钟的第 0 秒执行
  • "0 30 * * * *":每小时的第 30 分钟执行
  • "0 0 12 * * *":每天中午 12:00 执行
  • "0 0 0 * * *":每天午夜执行
  • "0 0 0 1 * *":每月 1 号午夜执行
4. 添加和管理任务

你可以使用 AddFunc 添加任务,也可以使用 AddJob 来添加实现了 cron.Job 接口的任务:

go">package main

import (
	"fmt"
	"time"

	"github.com/robfig/cron/v3"
)

// 自定义任务,必须实现 cron.Job 接口
type MyJob struct{}

func (m MyJob) Run() {
	fmt.Println("Custom job running at", time.Now())
}

func main() {
	c := cron.New()

	// 添加一个自定义任务
	c.AddJob("@every 1s", MyJob{})

	// 启动调度器
	c.Start()

	select {} // 阻塞主 goroutine
}
5. 上下文支持

robfig/cron/v3 支持任务执行的上下文,例如取消任务、超时等。以下示例展示了如何在任务中使用上下文:

go">package main

import (
	"context"
	"fmt"
	"time"

	"github.com/robfig/cron/v3"
)

func main() {
	c := cron.New()

	c.AddFunc("*/5 * * * * *", func() {
		ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
		defer cancel()

		select {
		case <-time.After(1 * time.Second):
			fmt.Println("Task completed at", time.Now())
		case <-ctx.Done():
			fmt.Println("Task timed out")
		}
	})

	c.Start()
	select {}
}
6. 使用场景
  • 定时任务执行:可以用于执行各种周期性任务,比如每小时执行数据同步、每天发送报告等。
  • 定期清理:自动清理临时文件、日志或缓存。
  • 定时备份:每天或每周定时备份数据库或文件。
  • 调度系统:构建任务调度系统,定期运行一组任务。
  • 批处理任务:定期处理一批任务,如批量发送电子邮件。
7. 高级用法
  • 任务移除:可以使用返回的 EntryID 移除任务。
  • 任务列表:可以使用 Entries() 方法获取当前的任务列表。
  • 停止调度器:使用 c.Stop() 停止调度器。
总结

robfig/cron 是一个功能强大的定时任务库,具有简单易用的 API 和灵活的调度表达式。它适用于各种需要定期执行任务的场景,例如数据同步、定时备份和批处理任务等。

Cron 在Gin中实践使用

要将 robfig/cron 的定时任务封装到一个单独的文件中,并在 Gin 项目中使用,可以按照以下步骤进行:

cron_163">1. 安装 robfig/cron

首先,确保安装了 robfig/cron

go get github.com/robfig/cron/v3
2. 封装定时任务

创建一个单独的文件,例如 cronjob.go,用于封装定时任务的逻辑。

cronjobgo___175">cronjob.go - 封装定时任务
go">package cronjob

import (
	"fmt"
	"time"

	"github.com/robfig/cron/v3"
)

// CronJobManager 用于管理 cron 实例
type CronJobManager struct {
	cron *cron.Cron
}

// NewCronJobManager 创建并返回一个新的 CronJobManager
func NewCronJobManager() *CronJobManager {
	return &CronJobManager{
		cron: cron.New(),
	}
}

// Start 开始执行定时任务
func (m *CronJobManager) Start() {
	m.cron.Start()
}

// Stop 停止执行定时任务
func (m *CronJobManager) Stop() {
	m.cron.Stop()
}

// AddTask 添加一个新的定时任务
func (m *CronJobManager) AddTask(schedule string, task func()) (cron.EntryID, error) {
	return m.cron.AddFunc(schedule, task)
}

// ExampleTask 示例任务
func ExampleTask() {
	fmt.Println("Task running at", time.Now())
}

在这个封装中,我们定义了 CronJobManager,用于管理 cron 实例,包括添加任务、启动和停止任务。AddTask 方法用于添加定时任务。

3. Gin 项目中使用定时任务

Gin 项目的入口文件(通常是 main.go)中引入并使用刚才封装的定时任务。

go___Gin__226">main.go - 在 Gin 中使用封装的定时任务
go">package main

import (
	"github.com/gin-gonic/gin"
	"your_project/cronjob" // 替换为你项目中 cronjob.go 的路径
)

func main() {
	// 创建一个新的 Gin 路由器
	r := gin.Default()

	// 创建 CronJobManager 实例
	cronManager := cronjob.NewCronJobManager()

	// 添加定时任务,例如每 5 秒执行一次
	_, err := cronManager.AddTask("@every 5s", cronjob.ExampleTask)
	if err != nil {
		panic(err)
	}

	// 启动定时任务
	cronManager.Start()
	defer cronManager.Stop() // 确保程序结束时停止定时任务

	// 定义路由
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})

	// 启动 Gin 服务器
	r.Run(":8080")
}
4. 代码说明
  • cronjob.go:

    • 封装了 CronJobManager,用于管理定时任务。
    • 提供了 NewCronJobManagerStartStopAddTask 方法,方便在其他地方使用。
    • ExampleTask 是一个示例任务函数,用于打印当前时间。
  • main.go:

    • 创建了 CronJobManager 的实例,并添加了一个每 5 秒执行一次的定时任务。
    • 使用 cronManager.Start() 启动定时任务。
    • Gin 路由器上定义了一个简单的 /ping 路由用于测试。
    • 使用 defer 确保程序退出时停止所有定时任务。
5. 运行项目

运行项目,控制台会每 5 秒输出一次 ExampleTask 中的日志,例如:

Task running at 2024-09-19 12:34:56
Task running at 2024-09-19 12:35:01

访问 http://localhost:8080/ping,会看到:

{
  "message": "pong"
}

通过这种方式,你可以在 Gin 项目中封装并使用 robfig/cron 的定时任务,使其更加模块化和易于维护。


http://www.niftyadmin.cn/n/5666598.html

相关文章

【Linux】yum、vim、gcc使用(超详细)

Linux中常见的软件安装方式 --------- 下载&&安装 a、yum/apt b、rpm安装包安装 c、源码安装 yum 关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!! 可以通过 ping 指令验证&#xff1a; ping www.baidu.com 安装软件 yum 会自动找到都有哪些软件包需要下载…

MySQl篇(SQL - 基本介绍)(持续更新迭代)

目录 一、简介 二、SQL方言&#xff08;分页查询为例&#xff09; 1. 简介 2. SQL方言大比拼 2.1. Oracle 2.1.1. 使用ROWNUM实现分页查询 2.1.2. 使用ROW_NUMBER()实现分页查询 2.2. MySQL 2.3. PostgreSQL 三、语法规范 四、注释 五、MySQL脚本中的标点符号 一、简…

c语言练习题1(数组和循环)

1实现一个对整形数组的冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的&#xff0c;直到没有再需要交换的元…

在 macOS 上安装 ADB给安卓手机装APK,同样适用智能电视、车机

在 macOS 上安装 ADB (Android Debug Bridge) 使用 Homebrew (推荐): Homebrew 是 macOS 上常用的包管理工具。如果你还没有安装 Homebrew&#xff0c;可以先安装它: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&qu…

chorme浏览器 您的连接不是私密连接

‌当浏览器显示“您的连接不是私密连接&#xff0c;攻击者可能会试图从 localhost 窃取您的信息&#xff08;例如&#xff1a;密码、消息或信用卡信息&#xff09;”的警告时&#xff0c;这通常意味着您正在尝试访问的网站的安全证书存在问题&#xff0c;可能是因为它使用的是自…

java之顺序表的创建

顺序表的定义&#xff1a; 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 我们现在要实现的顺序表功能有&#xff1a;增&#xff08;add&#xff09;、删(remove)、查(get&#xff09; …

Photoshop cc2019安装教程

软件介绍 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是美国Adobe公司旗下最为出名的图像处理软件系列之一&#xff0c;为图像扫描、编辑修改、图像制作、广告创意&#xff0c;图像输入与输出于一体的图形图像处理软件&#xff0c;深受广大平面设计人员和电脑美术爱好…

tomcat 配置jenkins_home 目录

要在 Tomcat 中为 Jenkins 配置自定义的 JENKINS_HOME 目录&#xff08;用于存储 Jenkins 的工作目录和配置&#xff09;&#xff0c;你需要在 Tomcat 的环境变量中进行配置。下面是详细步骤&#xff1a; 1. 创建 Jenkins Home 目录 首先&#xff0c;选择一个你想要作为 JENK…