Categorygithub.com/skyterra/util
repositorypackage
0.1.2
Repository: https://github.com/skyterra/util.git
Documentation: pkg.go.dev

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# README

util 工具库

schedule

提供基于时间点任务调度器,用户可以对任务设置执行时间,当时间到达时,调度器会自动执行该任务


package main

import (
	"fmt"
	"strconv"
	"time"
	"util/schedule"
)

type DemoTask struct {
	timestamp int64
}

func (r *DemoTask) RunAt() int64 {
	return r.timestamp
}

func (r *DemoTask) Run(s *schedule.TimingSchedule) {
	t := time.Unix(r.timestamp, 0)
	fmt.Printf("do demo task. runAt:%s now:%s\n", t.String(), time.Now())
}

func (r *DemoTask) OnError(err error) {

}

type ErrTask struct {
	timestamp int64
}

func (r *ErrTask) RunAt() int64 {
	return r.timestamp
}

func (r *ErrTask) Run(s *schedule.TimingSchedule) {
	panic("panic on run ErrTask")
}

func (r *ErrTask) OnError(err error) {
	fmt.Println(err)
	panic("panic on error")
}

func NewDemoTask(time string) schedule.ITimingTask {
	t, _ := schedule.NewTodayTime(time)
	return &DemoTask{timestamp: t}
}

func NewErrTask(time string) schedule.ITimingTask {
	t, _ := schedule.NewTodayTime(time)
	return &ErrTask{timestamp: t}
}

func GetNextSecondTime() string {
	now := time.Now().Format(time.RFC3339)
	hour, _ := strconv.Atoi(now[11:13])
	min, _ := strconv.Atoi(now[14:16])
	second, _ := strconv.Atoi(now[17:19])

	if second == 59 && min == 59 {
		hour++
		return fmt.Sprintf("%02d:%02d:%02d", hour, min, second)
	}

	if second == 59 {
		min++
		return fmt.Sprintf("%02d:%02d:%02d", hour, min, second)
	}

	second++
	return fmt.Sprintf("%02d:%02d:%02d", hour, min, second)
}

func main() {
	s := schedule.NewTimingSchedule(2, 1, NewErrTask(GetNextSecondTime()))
	for i := 0; i < 5; i++ {
		s.Push(NewDemoTask(GetNextSecondTime()))
	}

	s.Start()

	time.Sleep(3 * time.Second)
}