HypenZou / timed-task

提供持久化的定时任务

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

timed-task

It's a library helps you to add timed tasks in persistent way

here is the simplest demo:

type serialize struct{}

func (s *serialize) Deserialize(data []byte) (interface{}, error) {
	digitt, _ := strconv.ParseInt(string(data), 10, 64)
	t := time.Unix(digitt/1e9, digitt-int64(int(digitt/1e9))*1e9)
	return t, nil
}

func (s *serialize) Serialize(data interface{}) ([]byte, error) {
	if v, ok := data.(time.Time); ok {
		t := v.UnixNano()
		return []byte(strconv.FormatInt(t, 10)), nil
	}
	return nil, errors.ErrSerialize
}

func TestTimedTask(t *testing.T) {
	var se serialize
	timedtask, err := NewTimedTask("tmp", &se)
	if err != nil {
		log.Printf("new timedtask faild : %s", err)
	}
	err = timedtask.Recover()
	if err != nil {
		log.Printf("recover faild : %s", err)
	}
	timedtask.SetTask(func(msg interface{}) {
		t := time.Now()
		fmt.Println("触发误差:", t.Sub(msg.(time.Time)))
	})
	for i := 0; i < 10000; i++ {
		t := time.Millisecond * time.Duration(10*rand.Intn(100)+1)
		timedtask.AddTrigger(t, time.Now().Add(t))
		time.Sleep(time.Millisecond * 10)
	}

}

And if you want to do fixed-duration task , you can use this way:

	var se serialize
	ctx, cancel := context.WithCancel(context.Background())
	go func() {
		time.Sleep(time.Minute * 10)
		cancel()
	}()
	timedtask, err := NewTimedTask("tmp", &se)
	if err != nil {
		log.Printf("new timedtask faild : %s", err)
	}
	err = timedtask.Recover()
	if err != nil {
		log.Printf("recover faild : %s", err)
	}
	timedtask.SetTask(func(msg interface{}) {
		// do something
		t := time.Now()
		fmt.Println("触发误差:", t.Sub(msg.(time.Time)), "触发时间:", msg.(time.Time))
		// 添加下一次
		timedtask.TriggerAfter(time.Second, time.Now().Add(time.Second))
	})
	triggerTime, _ := time.ParseInLocation("2006-01-02 15:04:05", "2022-05-28 09:42:11", time.Local)
	timedtask.TriggerWhen(triggerTime, triggerTime)
	<-ctx.Done()

About

提供持久化的定时任务


Languages

Language:Go 100.0%