github.com/git-amp/amp-sdk-go@v0.7.5/stdlib/task/periodic_task.go (about)

     1  package task
     2  
     3  import (
     4  	"github.com/git-amp/amp-sdk-go/stdlib/utils"
     5  )
     6  
     7  type PeriodicTask struct {
     8  	Context
     9  	ticker  utils.Ticker
    10  	mailbox *utils.Mailbox
    11  	taskFn  func(ctx Context)
    12  }
    13  
    14  func NewPeriodicTask(name string, ticker utils.Ticker, taskFn func(ctx Context)) *PeriodicTask {
    15  	return &PeriodicTask{
    16  		ticker:  ticker,
    17  		mailbox: utils.NewMailbox(1),
    18  		taskFn:  taskFn,
    19  	}
    20  }
    21  
    22  func (task *PeriodicTask) OnContextStarted(ctx Context, parent Context) error {
    23  	task.ticker.Start()
    24  
    25  	task.Context.Go("ticker", func(ctx Context) {
    26  		for {
    27  			select {
    28  			case <-ctx.Done():
    29  				return
    30  
    31  			case <-task.ticker.Notify():
    32  				task.Enqueue()
    33  
    34  			case <-task.mailbox.Notify():
    35  				x := task.mailbox.Retrieve()
    36  				if x != nil {
    37  					task.taskFn(ctx)
    38  				}
    39  			}
    40  		}
    41  	})
    42  	return nil
    43  }
    44  
    45  func (task *PeriodicTask) Close() error {
    46  	task.ticker.Close()
    47  	return nil
    48  }
    49  
    50  func (task *PeriodicTask) Enqueue() {
    51  	task.mailbox.Deliver(struct{}{})
    52  }