scheduleTask.go 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package utils
  2. import (
  3. "time"
  4. )
  5. // ScheduleTask 定时任务
  6. type ScheduleTask interface {
  7. // Start 启动服务
  8. Start(delay ...time.Duration)
  9. // Stop 停止服务
  10. Stop()
  11. }
  12. // Task 任务, 返回下次执行的时间间隔
  13. type Task func() time.Duration
  14. // DefaultScheduleServer 默认 access_token 获取服务
  15. type DefaultScheduleServer struct {
  16. done chan bool
  17. task Task
  18. }
  19. // NewDefaultScheduleServer 构造默认 Token Server
  20. func NewDefaultScheduleServer() *DefaultScheduleServer {
  21. return &DefaultScheduleServer{
  22. done: make(chan bool),
  23. }
  24. }
  25. // SetTask 设置定时任务
  26. func (t *DefaultScheduleServer) SetTask(task Task) {
  27. t.task = task
  28. }
  29. // Stop 停止服务
  30. func (t *DefaultScheduleServer) Stop() {
  31. t.done <- true
  32. }
  33. // Start 启动服务
  34. func (t *DefaultScheduleServer) Start(delay ...time.Duration) {
  35. go t.start(delay...)
  36. }
  37. /**
  38. * 定时任务
  39. * 不依赖文件系统 或者 DB, 依据每次调用反馈的结果,进行下一次任务定时设置
  40. */
  41. func (t *DefaultScheduleServer) start(delay ...time.Duration) {
  42. go func() {
  43. if delay != nil && len(delay) > 0 {
  44. time.Sleep(delay[0])
  45. }
  46. d := t.task() // 上次任务, 返回下一次的执行周期
  47. for {
  48. time.Sleep(d)
  49. d = t.task()
  50. }
  51. }()
  52. for {
  53. select {
  54. case done := <-t.done:
  55. if done {
  56. return
  57. }
  58. }
  59. }
  60. }
  61. var _ ScheduleTask = &DefaultScheduleServer{}