golang 实现crontab的功能

golang 使用cron来实现自动运行


前言

在golang中的如何实现crontab?这个一直没有一个好的方法,毕竟不是在大厂只能自己摸索着来。写在这里用来记录自己的一些想法的步骤

提示:以下是本篇文章正文内容,下面案例可供参考

一、使用的模块是git上比较流行的robfig/cron

地址:https://github.com/robfig/cron
目前到了V3版本.
在这里插入图片描述 在这里插入图片描述

二、使用步骤

1.安装

go get github.com/robfig/cron/v3@v3.0.0

2.在项目中引用

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

三、使用

1. 初始化+最简单的模式

package main

//
///main.go
//author = "Derek Tian"
//Ver = 0.0.0.1
//make time = 8/10/2022 11:04
// note =
/

/*

 */

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)
 
func main() {
	// this is main function

	c := cron.New()
	aid, _ := c.AddFunc("@every 2s", func() { fmt.Println("Hi:", time.Now()) }) //这里实际上是返回一个EntryID和一个err
	
	c.Start()
	// 下面是一个示例中的死循环为了获得执行状态
	for {
		l := c.Entry(aid)
		fmt.Printf("aid[%d]的上一次启动时间:%v,下一次启动时间:%v\n", l.ID, l.Prev, l.Next)
		time.Sleep(5 * time.Second)
	}
   // 通过select 来实现无限循环+阻塞
	select {}
}

执行结果: 可以看到在第一次尝试获取上一次执行时间时结果时时间的空值,当第二次获取状态是拿到了争取的结果
在这里插入图片描述

2. 初始化+封装模式,这里要感谢DaSheng1104,借鉴了他的一篇文章:https://blog.youkuaiyun.com/LoganPython/article/details/125777340

我理解的部分啊,因为这个addjob实际上是万物都可以,只要实现了Run方法的,他都可以添加进去。

package main

//
///main.go
//author = "Derek Tian"
//Ver = 0.0.0.1
//make time = 8/10/2022 11:04
// note =
/

/*

 */

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

type aJob struct {
	ab string
}

func (t *aJob) Run() {
	fmt.Println(t.ab, "这是从ajob启动的 :", time.Now())
}

var (
	PaymentStatJob = aJob{}
)

func main() {
	// this is main function

	c := cron.New()
 
	aid, err := c.AddJob("@every 20s", &PaymentStatJob)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("aid:", aid)

	c.Start()
	for {
		l := c.Entry(aid)
		fmt.Printf("aid[%d]的上一次启动时间:%v,下一次启动时间:%v,运行状态:%v\n", l.ID, l.Prev, l.Next, l.Valid())
		time.Sleep(5 * time.Second)
	}

	select {}
}


这是执行结果
在这里插入图片描述

总结

使用起来很方便,但是无法持久化。我的思路是:

  1. 在mongoDB中建立一个表用来存储时间间隔和任务函数名称。
    2)在cron的主程序中注册所有的函数名。
    3)在cron程序启动时检查注册的内容,然后将内容分别加载job中。
    4)在redis中中存入Entry的ID和上下次的运行时间。
    5)在redis中存储运行状态。
    6)在更新redis中运行状态和结果日志时将最后一次正确运行的时间更新到mongodb中。这样保证了即使程序重启也知道上一次的最后运行时间和状态可以接着来(这比较适合domain)的模式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掉光头发的土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值