You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

ticktock.go 1.2 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package ticktock
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/go-co-op/gocron/v2"
  6. "gitlink.org.cn/cloudream/common/pkgs/logger"
  7. "gitlink.org.cn/cloudream/jcs-pub/coordinator/internal/db"
  8. )
  9. type Job interface {
  10. Name() string
  11. Execute(t *TickTock)
  12. }
  13. type cronJob struct {
  14. cronJob gocron.Job
  15. job Job
  16. }
  17. type TickTock struct {
  18. cfg Config
  19. sch gocron.Scheduler
  20. jobs map[string]cronJob
  21. db *db.DB
  22. }
  23. func New(cfg Config, db *db.DB) *TickTock {
  24. sch, _ := gocron.NewScheduler()
  25. t := &TickTock{
  26. cfg: cfg,
  27. sch: sch,
  28. jobs: map[string]cronJob{},
  29. db: db,
  30. }
  31. t.initJobs()
  32. return t
  33. }
  34. func (t *TickTock) Start() {
  35. t.sch.Start()
  36. }
  37. func (t *TickTock) Stop() {
  38. t.sch.Shutdown()
  39. }
  40. func (t *TickTock) RunNow(jobName string) {
  41. j, ok := t.jobs[jobName]
  42. if !ok {
  43. logger.Warnf("job %s not found", jobName)
  44. return
  45. }
  46. j.cronJob.RunNow()
  47. }
  48. func (t *TickTock) addJob(job Job, duration gocron.JobDefinition) {
  49. j, err := t.sch.NewJob(duration, gocron.NewTask(job.Execute, t))
  50. if err != nil {
  51. panic(fmt.Errorf("add job %s: %w", job.Name(), err))
  52. }
  53. t.jobs[job.Name()] = cronJob{
  54. cronJob: j,
  55. job: job,
  56. }
  57. }
  58. func (t *TickTock) initJobs() {
  59. t.addJob(&CheckHubState{}, gocron.DurationJob(time.Minute*5))
  60. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。