mirror of
https://github.com/lukaszraczylo/traefikoidc.git
synced 2026-10-14 04:07:46 +00:00
86 lines
2.1 KiB
Go
86 lines
2.1 KiB
Go
package traefikoidc
|
|
|
|
import "time"
|
|
|
|
// BackgroundTask represents a recurring task that runs in the background
|
|
type BackgroundTask struct {
|
|
stopChan chan struct{}
|
|
taskFunc func()
|
|
logger *Logger
|
|
name string
|
|
interval time.Duration
|
|
}
|
|
|
|
// NewBackgroundTask creates a new background task
|
|
func NewBackgroundTask(name string, interval time.Duration, taskFunc func(), logger *Logger) *BackgroundTask {
|
|
return &BackgroundTask{
|
|
name: name,
|
|
interval: interval,
|
|
stopChan: make(chan struct{}),
|
|
taskFunc: taskFunc,
|
|
logger: logger,
|
|
}
|
|
}
|
|
|
|
// Start begins the background task execution
|
|
func (bt *BackgroundTask) Start() {
|
|
go bt.run()
|
|
}
|
|
|
|
// Stop terminates the background task
|
|
func (bt *BackgroundTask) Stop() {
|
|
close(bt.stopChan)
|
|
}
|
|
|
|
// run is the main execution loop for the background task
|
|
func (bt *BackgroundTask) run() {
|
|
ticker := time.NewTicker(bt.interval)
|
|
defer ticker.Stop()
|
|
|
|
// Only log startup if debug level is enabled
|
|
if bt.logger != nil {
|
|
bt.logger.Info("Starting background task: %s", bt.name)
|
|
}
|
|
|
|
// Run task immediately on startup
|
|
bt.taskFunc()
|
|
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
bt.taskFunc()
|
|
case <-bt.stopChan:
|
|
// Only log shutdown
|
|
if bt.logger != nil {
|
|
bt.logger.Info("Stopping background task: %s", bt.name)
|
|
}
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
// autoCleanupRoutine periodically calls the provided cleanup function.
|
|
// It starts a ticker with the given interval and executes the cleanup function
|
|
// on each tick. The routine stops gracefully when a signal is received on the
|
|
// stop channel. This is typically used for background cleanup tasks like
|
|
// expiring cache entries.
|
|
//
|
|
// Parameters:
|
|
// - interval: The time duration between cleanup calls.
|
|
// - stop: A channel used to signal the routine to stop. Receiving any value will terminate the loop.
|
|
// - cleanup: The function to call periodically for cleanup tasks.
|
|
//
|
|
// Deprecated: Use BackgroundTask instead.
|
|
func autoCleanupRoutine(interval time.Duration, stop <-chan struct{}, cleanup func()) {
|
|
ticker := time.NewTicker(interval)
|
|
defer ticker.Stop()
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
cleanup()
|
|
case <-stop:
|
|
return
|
|
}
|
|
}
|
|
}
|