php小编百草为您介绍一种名为gocron的函数,它是一个标准库实现,具备可测试的特性。gocron函数的设计目的是为了提供一种简便的方式来创建和管理定时任务。它可以帮助开发人员轻松地编写和调度多个定时任务,同时还提供了灵活的测试功能,方便开发人员进行单元测试和功能验证。无论是在开发环境还是生产环境,gocron函数都是一个强大而可靠的工具,可用于实现各种复杂的定时任务需求。
问题内容
我需要按一定的时间间隔运行作业(点击休息端点,然后将消息发送到队列)。目前我有这个功能,它使用 gocron - https://github.com/go-co-op/gocron
但是目前没有停止该功能的机制,因此我无法干净地测试它。
func RunSchedule(cronExpression string, myFunction func()) error {
scheduler := gocron.NewScheduler(time.UTC)
_, err := scheduler.Cron(cronExpression).StartImmediately().Do(myFunction)
if err != nil {
return err
}
scheduler.StartBlocking()
return nil
}
登录后复制
它按要求执行,并以所需的时间间隔运行参数化函数,但我确信必须有一个更清晰的解决方案 - 可能是标准库。
解决方法
您可以只返回 .stop
函数:
func runschedule(cronexpression string, myfunction func()) (stop func(), err error) {
scheduler := gocron.newscheduler(time.utc)
_, err = scheduler.cron(cronexpression).startimmediately().do(myfunction)
if err != nil {
return nil, err
}
go func() {
scheduler.startblocking()
}()
return scheduler.stop, nil
}
登录后复制
然后在您的测试中您可以执行以下操作:
called := 0
stop, err := RunSchedule("some-schedule", func() {
called++
})
time.Sleep(time.Second * 1) // whatever you need to do
stop()
if called != 1 {
t.Fail("called should be 1")
}
登录后复制
以上就是gocron函数的标准库实现(可测试)的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!