test fail time

This commit is contained in:
huangsimin 2018-12-20 14:37:37 +08:00
parent 316d616419
commit cc37d62a2d

View File

@ -9,7 +9,7 @@ import (
"strings"
"time"
clinked "474420502.top/eson/structure/circular_linked"
"474420502.top/eson/structure/circular_linked"
"github.com/Pallinder/go-randomdata"
"github.com/davecgh/go-spew/spew"
@ -55,9 +55,10 @@ type Crontab struct {
YearPlan *trieYear
interval *clinked.CircularLinked
lastStatus bool
nextTime time.Time
interval *clinked.CircularLinked
lastStatus bool
isCalculated bool
nextTime time.Time
}
// NewCrontab create 一个crontab
@ -82,20 +83,17 @@ func (cron *Crontab) UnmarshalYAML(unmarshal func(interface{}) error) error {
return nil
}
// SetStatus 设置状态 接口定义
func (cron *Crontab) SetStatus(status interface{}) {
// SetStatus 设置上次状态 true false
func (cron *Crontab) SetStatus(status bool) {
if cron.interval != nil {
cron.lastStatus = status.(bool)
cron.lastStatus = status
}
}
// GetStatus 设置状态 接口定义
func (cron *Crontab) GetStatus() (status interface{}) {
if cron.interval != nil {
return cron.lastStatus
}
return nil
// GetStatus 获取上次状态 true false
func (cron *Crontab) GetStatus() (status bool) {
return cron.lastStatus
}
// TimeUp 是否时间快到
@ -111,6 +109,10 @@ func (cron *Crontab) TimeUp() bool {
// NextTime 返回下次任务的时间
func (cron *Crontab) NextTime() time.Time {
if cron.interval != nil {
if !cron.isCalculated {
now := time.Now()
cron.intervalCalculateNextTime(now)
}
return cron.nextTime
}
@ -136,6 +138,7 @@ func (cron *Crontab) FromString(crontab string) error {
// "f1-2|5-10x5,f1|10m,10-15,f1"
cron.lastStatus = true
cron.isCalculated = false
cron.interval = clinked.NewCircularLinked()
var intervalList []interface{}
intervalList = parseIntervalString(matches[0])
@ -214,30 +217,35 @@ func (cron *Crontab) linuxTimeUp() bool {
return false
}
// IntervalCalculateNextTime 计算时间间隔的下次时间
func (cron *Crontab) intervalCalculateNextTime(now time.Time) {
iv := cron.interval.Cursor().GetValue().(hInterval)
isecond := 0
if cron.lastStatus == false && len(iv.PlanFail) > 0 {
idx := randomdata.Number(len(iv.PlanFail))
lr := iv.PlanFail[idx]
isecond = randomdata.Number(lr.left, lr.right+1)
log.Println("fail time ", isecond)
} else {
idx := randomdata.Number(len(iv.PlanNormal))
lr := iv.PlanNormal[idx]
isecond = randomdata.Number(lr.left, lr.right+1)
}
iv.Count--
if iv.Count <= 0 {
iv.reset()
cron.interval.MoveNext()
}
cron.nextTime = now.Add(time.Duration(isecond) * time.Second)
}
func (cron *Crontab) intervalTimeUp() bool {
now := time.Now()
if now.Unix() >= cron.nextTime.Unix() {
iv := cron.interval.Cursor().GetValue().(hInterval)
isecond := 0
if cron.lastStatus == false && len(iv.PlanFail) > 0 {
idx := randomdata.Number(len(iv.PlanFail))
lr := iv.PlanFail[idx]
isecond = randomdata.Number(lr.left, lr.right+1)
} else {
idx := randomdata.Number(len(iv.PlanNormal))
lr := iv.PlanNormal[idx]
isecond = randomdata.Number(lr.left, lr.right+1)
}
iv.Count--
if iv.Count <= 0 {
iv.reset()
cron.interval.MoveNext()
}
cron.nextTime = now.Add(time.Duration(isecond) * time.Second)
cron.isCalculated = false
return true
}