|
@@ -0,0 +1,59 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ log "github.com/sirupsen/logrus"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+type TimeRange struct {
|
|
|
+ begin time.Time
|
|
|
+ end time.Time
|
|
|
+}
|
|
|
+
|
|
|
+type TimeRangeGen struct {
|
|
|
+ lastGenTimeUpper time.Time
|
|
|
+ upperTimeDurationFromNow time.Duration
|
|
|
+ C chan TimeRange
|
|
|
+ minRangeDuration time.Duration
|
|
|
+ maxRangeDuration time.Duration
|
|
|
+ stopChan chan bool
|
|
|
+ logger *log.Logger
|
|
|
+}
|
|
|
+
|
|
|
+func (tr *TimeRangeGen) start() {
|
|
|
+ go tr.startGen()
|
|
|
+ tr.logger.Infof("started")
|
|
|
+}
|
|
|
+
|
|
|
+func (tr *TimeRangeGen) startGen() {
|
|
|
+ tm := time.NewTimer(1 * time.Second)
|
|
|
+forLoop:
|
|
|
+ for {
|
|
|
+ select {
|
|
|
+ case <-tr.stopChan:
|
|
|
+ tr.logger.Infof("stop signal received, quit")
|
|
|
+ break forLoop
|
|
|
+ case <-tm.C:
|
|
|
+ tr.checkGenTimeRange()
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (tr *TimeRangeGen) stop() {
|
|
|
+ tr.stopChan <- true
|
|
|
+ tr.logger.Infof("stoped")
|
|
|
+}
|
|
|
+
|
|
|
+func (tr *TimeRangeGen) checkGenTimeRange() {
|
|
|
+ now := time.Now()
|
|
|
+ upper := now.Add(-tr.upperTimeDurationFromNow)
|
|
|
+ range2Gen := upper.Sub(tr.lastGenTimeUpper)
|
|
|
+ if range2Gen < tr.minRangeDuration {
|
|
|
+ tr.logger.Debugf("%v < %v, skip gen", range2Gen, tr.minRangeDuration)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ tr.logger.Debugf("start check gen time range in [%v, %v)", tr.lastGenTimeUpper, upper)
|
|
|
+ for i := tr.lastGenTimeUpper; i.Before(upper); i = i.Add(tr.maxRangeDuration) {
|
|
|
+
|
|
|
+ }
|
|
|
+}
|