让golang的cron库支持带事件参数的回调

基于Go与Etcd构建高可用分布式定时任务调度系统 定时任务调度是后端系统的基础组件,用于在预定时间或周期性地自动执行特定操作。其核心原理在于将任务触发与执行解耦,通过可靠的协调机制确保在分布式环境下任务的唯一性与高可用性。这一技术对于构建稳定、可扩展的在线服务具有重要价值,广泛应用于数据对账、报表生成、缓存刷新等关键业务场景。本文聚焦于如何利用Go语言的并发特性和Etcd的强一致性,设计并实现一个能够横跨多个数据中心的分布式Cron服务。文章深入探讨了以Golang事件分发机制和分布式锁为核心的技术方案,详细解析了从调度决策、事件分发到任务执行的完整架构, 阅读详情

一直在寻觅c/c++下的cron库,可惜一直没找到。目前对我来说,cron可以做定时的某活动,比如晚上八点怎么怎么的,golang下有大神提供的cron库,那么这部分的实现还是放到go实现的服务器下面吧,然后再通知别的服务器,只能绕路子了。


go下的cron库使用的是 github.com/robfig/cron,最终使用的是 github.com/jakecoffman/cron,后者也是前者的改进版,主要增加了个RemoveJob的函数来移除特定的任务。


主要使用中的不变就是自带的回调为一个func(),无任何参数,所以被激活的时候无法判断到底是哪个计划任务被调度了,写多个函数也比较麻烦,于是看看是否能修改下源码来完成这个功能。后来看了下代码,原来不用修改代码就可以实现,设计的还是不错的,只要实现一个Job的interface就可以了,那么动手吧。


type Job interface {
	Run()
}

我们的目标就是实现这个接口,cron库自带的一个封装就是直接把func() type成这个类型,然后实现Run这个函数。我们这里麻烦点,定义成

type SchduleActiveCallback func(int)

type ScheduleJob struct {
	id       int
	callback SchduleActiveCallback
}


然后实现Run方法

func (this *ScheduleJob) Run() {
	if nil != this.callback {
		this.callback(this.id)
	} else {
		shareutils.LogErrorln("Invalid callback function")
	}
}

剩下就简单啦,不要使用AddFunc这个函数,使用AddJob这个函数,将我们实现的Job扔进去就Ok啦。

func (this *ScheduleManager) AddJob(id int, scheduleExpr string) {
	job := NewScheduleJob(id, this._scheduleActive)
	this.cronJob.AddJob(scheduleExpr, job, strconv.Itoa(id))
}

func (this *ScheduleManager) _scheduleActive(id int) {
	shareutils.LogDebugln("Job active:", id)
	msg := &MThreadMsg{}
	msg.Event = kMThreadMsg_ScheduleActive
	msg.LParam = id
	PostMThreadMsg(msg)
}

千万记得回调是在别的routine里的,别忘记同步了。


于是大概的整体实现就像下面一样,反正大概能实现需求就行了,回调的时候带了个id,就可以知道是哪个job被调用了

package main

import (
	"github.com/jakecoffman/cron"
	"shareutils"
	"strconv"
)

type SchduleActiveCallback func(int)

type ScheduleJob struct {
	id       int
	callback SchduleActiveCallback
}

func NewScheduleJob(_id int, _job SchduleActiveCallback) *ScheduleJob {
	instance := &ScheduleJob{
		id:       _id,
		callback: _job,
	}
	return instance
}

func (this *ScheduleJob) Run() {
	if nil != this.callback {
		this.callback(this.id)
	} else {
		shareutils.LogErrorln("Invalid callback function")
	}
}

type ScheduleManager struct {
	cronJob *cron.Cron
}

func NewScheduleManager() *ScheduleManager {
	instance := &ScheduleManager{}
	instance.cronJob = cron.New()
	return instance
}

func (this *ScheduleManager) Start() {
	this.cronJob.Start()
}

func (this *ScheduleManager) Stop() {
	this.cronJob.Stop()
}

func (this *ScheduleManager) AddJob(id int, scheduleExpr string) {
	job := NewScheduleJob(id, this._scheduleActive)
	this.cronJob.AddJob(scheduleExpr, job, strconv.Itoa(id))
}

func (this *ScheduleManager) RemoveJob(id int) {
	this.cronJob.RemoveJob(strconv.Itoa(id))
}

func (this *ScheduleManager) _scheduleActive(id int) {
	shareutils.LogDebugln("Job active:", id)
	msg := &MThreadMsg{}
	msg.Event = kMThreadMsg_ScheduleActive
	msg.LParam = id
	PostMThreadMsg(msg)
}

var g_scheduleManager *ScheduleManager

func init() {
	g_scheduleManager = NewScheduleManager()
}


go的Job Scheduling 概念JobJob封装(encapsulates)一个“任务task”,它由一个go函数和任意函数参数组成。该作业向调度程序提供该作业下次应计划运行的时间。Scheduler调度程序跟踪(keeps track of)所有作业,并在每个作业准备好运行时将其发送到执行程序。Executor执行器调用作业的任务并管理不同作业执行时序要求的复杂性例如单例singletons不应相互溢出(overrun each other) 阅读详情

相关推荐

Go毫秒级定时任务实战:从Cron局限到调度器选型

定时任务是分布式系统的基础能力,其精度直接影响实时数据采集、IoT设备同步、金融风控等关键场景的可靠性。传统Cron基于操作系统时钟中断与串行goroutine模型,天然受限于秒级粒度与调度不确定性;而毫秒级需求本质是对实时性、确定性与抗干扰能力的综合挑战。Go语言中实现高精度调度,需深入理解time.Ticker底层机制、runtime调度特性及容器化环境对时钟漂移的影响。本文结合工业网关、行情快照等真实案例,解析robfig/cron的精度瓶颈、自研毫秒调度器的设计要点,以及Temporal等Workf

weixin_34290631的博客 331

golang定时任务jakecoffman/cron包的使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33856370的博客 836

VMvare 桥接模式无法联网、没有未桥接的主机网络适配器,无法将网络更改为桥接状态。

很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!战项目源码讲义》点击传送门即可获取!**

q16974058的博客 4332

开源项目 `jakecoffman/cron` 使用教程

开源项目 jakecoffman/cron 使用教程 1. 项目的目录结构及介绍 cron/ ├── cmd/ │ └── cron/ │ └── main.go ├── cron/ │ ├── cron.go │ ├── doc.go │ ├── entry.go │ ├── job.go │ ├── logger.go │ ├── parser.go │...

gitblog_00703的博客 455

基因的富集分析

通过RNA_seq差异表达分析等获得一组基因,想要进一步了解这些基因可能参与哪些生物学过程,具有哪些功能,一般就会用到基因的富集分析了。现在小麦基因注释信息已经可以获得,目前来看包括两套。一个是TGACv1,另一个就是IWGSC1.0。需要用到一个叫“clusterProfiler”的R包。下面用到的数据集来自TGACv1。1、安装source("https://bioconductor.org/b

xxxxx 1万+

【实战指南】Green Hills MULTI-IDE 从零安装到工程创建全流程

本文详细介绍了Green Hills MULTI-IDE从零安装到工程创建的全流程,包括系统要求检查、安装步骤、工程配置及调试技巧。特别适合嵌入式开发新手快速上手这款专业IDE工具,提升开发效率。

weixin_28740299的博客 477

go语言里比较好用的计划任务调度模块

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34007020的博客 269

如何点亮一颗sensor

要点亮一个sensor需要从,时钟、sensorI2C,供电,reset脚,mipi的配置几个方面一一确认。 reset脚拉高 给sensor的时钟有没有。(目前用到的常为24MHZ) 供电 查看sensor的数据手册,看有几个电源,用示波器量一下是否为手册规定的电压 比如:DVDD 数字电压: AVDD模拟电压 DOVDD芯片引脚出来的电压等为多少。 sensor的I2C能否抓到 将I2C的口对应上,用示波器量取i2c的波形。 检查有应答并且数据正确。读写地址是否正...

weixin_40787463的博客 3648

go第三方库文档 定时任务cron

//go第三方库文档 定时任务cron // https://pkg.go.dev/github.com/robfig/cron/v3 // 安装 // 要下载特定的标记版本,请运行: go get github.com/robfig/cron/v3@v3.0.0 // 将其作为以下内容导入程序: import "github.com/robfig/cron/v3" // 由于使用Go模块,它需要Go 1.11或更高版本。 // 用法 // 调用方可以注册要在给定计划中调用的FUNC。Cron将在他..

liao__ran的博客 1270

科技与伦理的平衡点:人类计算的伦理

科技与伦理的平衡点:人类计算的伦理 关键词 科技与伦理 人类计算 隐私问题 道德决策自动化 公平性与偏见 法律与社会责任 摘要 本

AI天才研究院 1163

【Windows Server 2019】活动目录 (Active Directory) ——将计算机加入域和脱离域

博文介绍了如何将计算机加入AD域和脱离AD域,包括加入域,验证客户机加入到域后的信息,使用域账户用户在客户机上登录,使用本地账户用户在计算机上登录,脱离域。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 6169

GO语言定时任务实战-gocron包

1. 基本使用 1.1 初始化实例 new() 1.2 添加定时任务 AddFunc() 1.3 开始定时任务 Start() 1.4 完整示例 1.5 第一次执行定时任务的契机 1.6 spec 的设置 2. 粒度到秒 2.1 语法示例 2.2 完整示例 3. 按时间间隔 3.1 语法 3.2 完整示例(@every) 3.3 完整示例

架构+开发+运维 1558

【29】软考软件设计师——SQL语句编写与优化深度精讲|数据库大题延伸满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第29篇,承接第28篇ER图转关系模式核心内容,作为**下午第2题数据库大题核心延伸必考模块**,单模块累计占分5~8分,是数据库板块性价比极高的提分重点。全文超4000字深度拆解软考全部SQL高频考点:全覆盖多表连接底层逻辑、嵌套子查询分类实操、GROUP BY分组聚合硬核规则、索引全品类设计原理、联合索引最左匹配底层机制,搭配海量可直接复刻的考场SQL模板、历年真题完整改写案例、索引失效场景实操复盘、慢查询优化落地技巧。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 526

闲鱼监控登录态一键导出:ai-goofish-monitor 自带扩展四步搞定

浏览器里闲鱼明明登录着,ai-goofish-monitor 的监控任务却不认你,问题多半卡在登录态这一步。仓库 `chrome-extension/` 里自带一个 Chrome 扩展,点两下就能把完整登录态导出成 JSON,不用手写任何抓取代码。跟着做完,你的监控任务就能跑起来。 ## 先跑通:四步拿到登录态 JSON 1. 拉下仓库,扩展源码就在 `chrome-extension/` 文

gitblog_00042的博客 171

智能车图像处理21-进阶篇13--正入十字补线2

这篇文章主要的正入十字补线与1基本相同,主要防止图像中双十字的问题。

taiyuezyh的博客 2033

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

使用 Go 向 Healthchecks 发送心跳:基于 HTTP 的 Cron 任务监控实战指南

Healthchecks 是一款用 Python 与 Django 编写的开源定时任务(cron job)与后台任务监控服务,其工作方式非常简单:监控方只是一个 HTTP 端点,你的任务只要在运行时"ping"一下该端点即可。本文以仓库中面向 Go 开发者的入门文档 [templates/docs/go.md](https://link.gitcode.com/i/7fe5e60cbdb93b49

gitblog_00137的博客 957

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入理解 go-fastping:基于 Go 的 ICMP Ping 库及其在 Cloudpods 网络探测中的应用

go-fastping 是一个用 Go 语言实现的 ICMP Ping 库,设计灵感来自 Perl 模块 `AnyEvent::FastPing`,核心目标是用极小的开销向多个主机批量发送 ICMP ECHO REQUEST 报文并快速收集响应与往返时延(RTT)。本文将从它的安装、核心 API、回调机制讲起,结合仓库内源码逐层拆解其发送/接收与 RTT 计算的底层实现,最后以 Cloudpods

gitblog_00842的博客 359

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Woodpecker CI 定时任务(Cron Jobs)完整指南:从事件过滤配置到调度原理

Cron(定时任务)是 Woodpecker 内置的定时流水线触发机制,允许你按固定计划(如每天、每 5 分钟)在指定分支上自动运行流水线中的部分或全部步骤,适用于定时同步、夜间构建、周期性清理等场景。本文将围绕 [version-3.17 文档](https://link.gitcode.com/i/e52c86a73ad53954a5cbd69a0248cd4b) 展开,完整讲解配置步骤、调度

gitblog_00299的博客 165

Woodpecker CI/CD 定时任务(Cron)完整配置指南:从事件过滤到调度原理

Woodpecker 内置了与 CI 流水线深度集成的定时任务(Cron)能力,允许你在指定时间自动触发流水线,适用于定时同步、夜间构建、周期性巡检、数据备份等场景。本文以 Woodpecker 2.8 的官方文档为骨架,结合仓库源码(调度器、数据模型、API、约束匹配)讲解如何配置 `when.event: cron` 事件过滤、创建定时任务、编写调度表达式,并揭示定时任务从数据库取出到流水线创

gitblog_01160的博客 191

Dokku 定时任务(Scheduled Cron Tasks)完全指南:从 app.json 声明到 cron:run 实战

本篇技术指南围绕 Dokku 内置的定时任务(Scheduled Cron Tasks)能力展开,详细讲解如何通过 `app.json` 中的 `cron` 键为应用声明周期性执行的命令,如何用 `cron:set`、`cron:list`、`cron:suspend`、`cron:resume`、`cron:run`、`cron:report` 等命令管理任务生命周期,以及如何通过 vector

gitblog_00561的博客 619

BBS-Go:5分钟构建现代化企业级社区论坛的Golang开源解决方案

BBS-Go是一款基于Golang开发的高性能开源社区平台,为技术决策者和开发者提供快速构建现代化论坛、知识库和问答社区的完整解决方案。这个轻量级社区系统集成了论坛讨论、问答流程、文章发布、用户互动和运营治理等核心功能,特别适合需要快速部署、易于扩展且性能卓越的技术社区场景。 ## 技术架构深度解析:模块化设计的企业级社区引擎 BBS-Go采用分层架构设计,核心模块清晰分离,确保系统的高可维护

gitblog_00719的博客 513

Claude Desktop 中文补丁 5 分钟装完:桌面版一键汉化完整指南

如果你装好的 Claude 桌面版(Claude Desktop)满屏英文,找菜单、看设置全得靠猜,这篇就是帮你把它一键变成中文的。项目叫 claude-desktop-zh-cn,是一个 Claude Desktop 中文补丁:一条脚本装完,整个界面(包括登录后的在线页面)就变中文,还支持一键还原回英文原版,全程 5 分钟以内。 ## 一句话定位 它是 Claude Desktop 的本地中

gitblog_00519的博客 372

DBOS快速上手:5分钟用Go+Postgres跑通第一个持久化工作流(含SQLite零配置开发)

**DBOS Transact**(dbos-transact-golang)是一个基于 Postgres 的轻量级持久化工作流(Durable Workflow)编排库,让你用几行 Go 代码就能让程序在崩溃后自动从检查点恢复。本文将带你快速上手 DBOS:5 分钟内用 **Go + Postgres** 跑通第一个持久化工作流,并额外介绍 **SQLite 零配置开发**方式——本地开发连数据

gitblog_00614的博客 482

Go学习路线

今天在开发的时候,找不到合适的包,翻了好久github没有合适的,我发现有个文章开源的包很全,所以就记录下来了,也提供给大家了!!! API 服务和工具 图形语言 GraphJin - 用于 Postgres 的即时 GraphQL API。无需代码,将 GraphQL 编译为 SQL。 MTProto MTProto - 在纯 Go 上编写的 Telegram API 的完整本实现。 天文学 go-fits - FITS(灵活图像传输系统)格式图像和数据读取器 astrogo/...

多看多听多总结 6250

Go语言实现定时任务的方法

定时任务是指按照预定的时间间隔或特定时间点自动执行的任务或操作。这些任务通常用于自动化重复性的工作,以减轻人工操作的负担,提高效率。定时任务是一种常见的编程模式,用于周期性地执行某些操作、处理数据或触发事件。在生活中类似这样的活动也很多,比如你上班的时候,会定一个8点的闹钟。正在上传…重新上传取消Go语言提供了多种实现定时任务的方法,可以根据需求和复杂性选择合适的方式。标准库的 time 包适用于简单的定时任务,而第三方库如 cron 和 gocron 则提供了更丰富的功能和配置选项。

爱编程的鱼的博客 1153

如何快速上手MCP for Security:5分钟让Nmap和SQLMap接入AI助手

MCP for Security 是一个开源的 Model Context Protocol(MCP)服务器合集,把 Nmap、SQLMap、FFUF、Masscan 等 20 多款主流安全测试工具统一封装成标准 MCP 接口,让 AI 助手能直接调用它们完成渗透测试与安全审计。本文带你在 5 分钟内完成安装,并接入第一个 MCP 服务器。 ## 什么是 MCP for Security? M

gitblog_00145的博客 754
上一篇: c++计算网络延迟毫秒数
下一篇: 换一种思路实现c调用lua函数
碎炎
博客等级 码龄16年 85粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值