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  }