Initial task scheduler implementation
This commit is contained in:
		@@ -8,7 +8,8 @@ import (
 | 
			
		||||
 | 
			
		||||
// App contains and supplies available configurations and connections
 | 
			
		||||
type App struct {
 | 
			
		||||
	Config config.Configuration // Configuration file
 | 
			
		||||
	Db     *sql.DB              // Database connection
 | 
			
		||||
	Res    *embed.FS            // Resources from the embedded filesystem
 | 
			
		||||
	Config         config.Configuration // Configuration file
 | 
			
		||||
	Db             *sql.DB              // Database connection
 | 
			
		||||
	Res            *embed.FS            // Resources from the embedded filesystem
 | 
			
		||||
	ScheduledTasks Scheduled            // Scheduled contains a struct of all scheduled functions
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										69
									
								
								app/schedule.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								app/schedule.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
package app
 | 
			
		||||
 | 
			
		||||
import "time"
 | 
			
		||||
 | 
			
		||||
type Scheduled struct {
 | 
			
		||||
	EveryReboot []func(app *App)
 | 
			
		||||
	EverySecond []func(app *App)
 | 
			
		||||
	EveryMinute []func(app *App)
 | 
			
		||||
	EveryHour   []func(app *App)
 | 
			
		||||
	EveryDay    []func(app *App)
 | 
			
		||||
	EveryWeek   []func(app *App)
 | 
			
		||||
	EveryMonth  []func(app *App)
 | 
			
		||||
	EveryYear   []func(app *App)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Task struct {
 | 
			
		||||
	Interval time.Duration
 | 
			
		||||
	Funcs    []func(app *App)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func RunScheduledTasks(app *App, poolSize int, stop <-chan struct{}) {
 | 
			
		||||
	// Run every time the server starts
 | 
			
		||||
	for _, f := range app.ScheduledTasks.EveryReboot {
 | 
			
		||||
		f(app)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tasks := []Task{
 | 
			
		||||
		{Interval: time.Second, Funcs: app.ScheduledTasks.EverySecond},
 | 
			
		||||
		{Interval: time.Minute, Funcs: app.ScheduledTasks.EveryMinute},
 | 
			
		||||
		{Interval: time.Hour, Funcs: app.ScheduledTasks.EveryHour},
 | 
			
		||||
		{Interval: 24 * time.Hour, Funcs: app.ScheduledTasks.EveryDay},
 | 
			
		||||
		{Interval: 7 * 24 * time.Hour, Funcs: app.ScheduledTasks.EveryWeek},
 | 
			
		||||
		{Interval: 30 * 24 * time.Hour, Funcs: app.ScheduledTasks.EveryMonth},
 | 
			
		||||
		{Interval: 365 * 24 * time.Hour, Funcs: app.ScheduledTasks.EveryYear},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Set up task runners
 | 
			
		||||
	runners := make([]chan bool, len(tasks))
 | 
			
		||||
	for i, task := range tasks {
 | 
			
		||||
		runner := make(chan bool, poolSize)
 | 
			
		||||
		runners[i] = runner
 | 
			
		||||
		go func(task Task, runner chan bool) {
 | 
			
		||||
			ticker := time.NewTicker(task.Interval)
 | 
			
		||||
			defer ticker.Stop()
 | 
			
		||||
			for {
 | 
			
		||||
				select {
 | 
			
		||||
				case <-ticker.C:
 | 
			
		||||
					for _, f := range task.Funcs {
 | 
			
		||||
						runner <- true
 | 
			
		||||
						go func(f func(app *App)) {
 | 
			
		||||
							defer func() { <-runner }()
 | 
			
		||||
							f(app)
 | 
			
		||||
						}(f)
 | 
			
		||||
					}
 | 
			
		||||
				case <-stop:
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}(task, runner)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Wait for termination
 | 
			
		||||
	for _, runner := range runners {
 | 
			
		||||
		for i := 0; i < cap(runner); i++ {
 | 
			
		||||
			runner <- false
 | 
			
		||||
		}
 | 
			
		||||
		close(runner)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user