gitee.com/h79/goutils@v1.22.10/common/scheduler/trigger.go (about) 1 package scheduler 2 3 import ( 4 "errors" 5 "fmt" 6 "time" 7 ) 8 9 // Trigger represents the mechanism by which Jobs are scheduled. 10 type Trigger interface { 11 Type() string 12 13 // NextFireTime returns the next time at which the Trigger is scheduled to fire. 14 NextFireTime(prev int64) (int64, error) 15 16 // Description returns the description of the Trigger. 17 Description() string 18 } 19 20 // SimpleTrigger implements the quartz.Trigger interface; uses a fixed interval. 21 type SimpleTrigger struct { 22 Interval time.Duration 23 } 24 25 // Verify SimpleTrigger satisfies the Trigger interface. 26 var _ Trigger = (*SimpleTrigger)(nil) 27 28 // NewSimpleTrigger returns a new SimpleTrigger using the given interval. 29 func NewSimpleTrigger(interval time.Duration) *SimpleTrigger { 30 return &SimpleTrigger{ 31 Interval: interval, 32 } 33 } 34 35 func (st *SimpleTrigger) Type() string { 36 return "simple" 37 } 38 39 // NextFireTime returns the next time at which the SimpleTrigger is scheduled to fire. 40 func (st *SimpleTrigger) NextFireTime(prev int64) (int64, error) { 41 next := prev + st.Interval.Nanoseconds() 42 return next, nil 43 } 44 45 // Description returns the description of the trigger. 46 func (st *SimpleTrigger) Description() string { 47 return fmt.Sprintf("SimpleTrigger with interval: %d", st.Interval) 48 } 49 50 // OnceTrigger implements the quartz.Trigger interface. 51 // This type of Trigger can only be fired once and will expire immediately. 52 type OnceTrigger struct { 53 Delay time.Duration 54 expired bool 55 } 56 57 // Verify OnceTrigger satisfies the Trigger interface. 58 var _ Trigger = (*OnceTrigger)(nil) 59 60 // NewOnceTrigger returns a new OnceTrigger with the given delay time. 61 func NewOnceTrigger(delay time.Duration) *OnceTrigger { 62 return &OnceTrigger{ 63 Delay: delay, 64 expired: false, 65 } 66 } 67 68 func (tr *OnceTrigger) Type() string { 69 return "once" 70 } 71 72 // NextFireTime returns the next time at which the OnceTrigger is scheduled to fire. 73 // Sets expired to true afterwards. 74 func (tr *OnceTrigger) NextFireTime(prev int64) (int64, error) { 75 if !tr.expired { 76 next := prev + tr.Delay.Nanoseconds() 77 tr.expired = true 78 return next, nil 79 } 80 81 return 0, errors.New("RunOnce trigger is expired") 82 } 83 84 // Description returns the description of the trigger. 85 func (tr *OnceTrigger) Description() string { 86 status := "valid" 87 if tr.expired { 88 status = "expired" 89 } 90 91 return fmt.Sprintf("OnceTrigger (%s).", status) 92 }