使用分布式锁启动 cronjob, 保证只有一个服务执行 cronjob
package cronjob
import (
"context"
"time"
"github.com/robfig/cron/v3"
goredislib "github.com/redis/go-redis/v9"
"github.com/go-redsync/redsync/v4"
"github.com/go-redsync/redsync/v4/redis/goredis/v9"
)
const (
lockKey = "cronjoblock"
lockTimeout = 60 * time.Second
)
func RunCronJob() {
ctx := context.Background()
client := goredislib.NewClient(&goredislib.Options{
Addr: Redis.Addr,
Password: Redis.Password,
DB: Redis.DB,
})
pool := goredis.NewPool(client)
rs := redsync.New(pool)
mutex := rs.NewMutex(lockKey, redsync.WithExpiry(60*time.Second))
if err := mutex.Lock(); err != nil {
return
}
c := cron.New()
c.AddJob("13 13 * * *", cron.NewChain(cron.Recover(cron.DefaultLogger)).Then(&xxxxx{}))
c.Start()
select{
case <-ctx.Done():
if ok, err := mutex.Unlock(); !ok || err != nil {
panic("unlock failed")
}
return
}
}