如何在go-micro v4框架中设置定时任务?求示例参考
Go-Micro v4 定时任务实现示例
Go-Micro v4 本身没有内置定时任务模块,通常结合Go生态中成熟的定时库 github.com/robfig/cron/v3 来实现,下面是完整的实现示例:
1. 安装依赖
首先安装所需的依赖包:
go get github.com/go-micro/v4 go get github.com/robfig/cron/v3
2. 完整示例代码
package main import ( "context" "fmt" "log" "os" "os/signal" "syscall" "github.com/go-micro/v4" "github.com/robfig/cron/v3" ) // 定时任务执行函数示例 func sampleTask() { fmt.Println("定时任务执行中:", cron.Now().Format("2006-01-02 15:04:05")) // 可在此扩展业务逻辑,比如调用Go-Micro服务 // 示例:调用其他服务 // client := micro.NewService() // req := client.NewRequest("service.name", "Method", &Request{}) // var rsp Response // if err := client.Call(context.Background(), req, &rsp); err != nil { // log.Fatal(err) // } } func main() { // 初始化Go-Micro服务 service := micro.NewService( micro.Name("cron.service"), micro.Version("v1.0.0"), ) service.Init() // 初始化支持秒级定时的Cron实例 c := cron.New(cron.WithSeconds()) // 添加每5秒执行一次的定时任务 _, err := c.AddFunc("*/5 * * * * *", sampleTask) if err != nil { log.Fatalf("添加定时任务失败: %v", err) } // 添加每日凌晨2点执行的定时任务 _, err = c.AddFunc("0 0 2 * * *", func() { fmt.Println("每日定时任务执行:", cron.Now().Format("2006-01-02 15:04:05")) }) if err != nil { log.Fatalf("添加每日定时任务失败: %v", err) } // 启动Cron调度器 c.Start() defer c.Stop() // 监听系统退出信号,实现优雅关机 sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) // 启动Go-Micro服务 go func() { if err := service.Run(); err != nil { log.Fatalf("服务启动失败: %v", err) } }() // 等待退出信号触发 <-sigChan log.Println("开始停止服务和定时任务...") }
3. 关键说明
- Cron表达式: 示例启用了秒级精度(通过
cron.WithSeconds()),使用6位表达式;若不需要秒级定时,可移除该选项,使用标准5位表达式。 - 生命周期管理: 通过
defer c.Stop()确保服务退出时定时任务优雅停止,结合系统信号监听实现整体服务的优雅关机。 - 业务扩展: 定时任务函数内可直接调用Go-Micro客户端,实现服务间调用,完成复杂业务逻辑。
- 多任务支持: 可通过
c.AddFunc()或c.AddJob()添加多个不同规则的定时任务,满足多样化需求。
内容的提问来源于stack exchange,提问作者FamousMai
相关产品推荐
相关产品推荐

