Go Task scheduler is a small library that you can use within your application that enables you to execute callbacks (goroutines) after a pre-defined
amount of time. GTS also provides task storage which is used to invoke callbacks for tasks which couldn't be executed
during down-time as well as maintaining a history of the callbacks that got executed.
** Fixed in this fork:
- Update recurring tasks last and next run values
- Add tasks and persist to DB on the fly, not only on service spin-up
- Persisted tasks execution (recurring and scheduled) on service restart
- Due task should execute as soon as service restarts
** Features
- Execute tasks based after a specific duration or at a specific point in time
- Job stores for history & recovery, provided stores out of the box:
- Postgres
Instantiate a scheduler as follows:
#+BEGIN_SRC go
s := scheduler.New(storage, funcManager)
#+END_SRC
GTS currently supports 1 kind of storage:
- PostgresStorage: Persists tasks into a SQLite3 database.
#+BEGIN_SRC go
postgresStorage := storage.NewPostgresStorage()
#+END_SRC
Example:
#+BEGIN_SRC go
storage := storage.NewPostgresStorage(
storage.PostgresDBConfig{
DbURL: "postgresql://:@localhost:5432/?sslmode=disable",
},
)
if err := storage.Connect(); err != nil {
log.Fatal("Could not connect to db", err)
}
if err := storage.Initialize(); err != nil {
log.Fatal("Could not intialize database", err)
}
#+END_SRC
and then pass it to the scheduler.
Scheduling tasks can be done in 3 ways:
** Execute a task after 5 seconds.
#+BEGIN_SRC go
func MyFunc(arg1 string, arg2 string)
taskID := s.RunAfter(5*time.Second, MyFunc, "Hello", "World")
#+END_SRC
** Execute a task at a specific time.
#+BEGIN_SRC go
func MyFunc(arg1 string, arg2 string)
taskID := s.RunAt(time.Now().Add(24 * time.Hour), MyFunc, "Hello", "World")
#+END_SRC
** Execute a task every 1 minute.
#+BEGIN_SRC go
func MyFunc(arg1 string, arg2 string)
taskID := s.RunEvery(1 * time.Minute, MyFunc, "Hello", "World")
#+END_SRC
The [[https://github.com/ClubNFT/scheduler/tree/master/_example/][Examples]] folder contains a bunch of code samples you can look into.
GTS supports the ability to provide a custom storage, the newly created storage has to implement the TaskStore interface
#+BEGIN_SRC go
type TaskStore interface {
Store(task *TaskAttributes) error
Remove(task *TaskAttributes) error
Fetch() ([]TaskAttributes, error)
}
#+END_SRC
TaskAttributes looks as follows:
#+BEGIN_SRC go
type TaskAttributes struct {
Hash string
Name string
LastRun string
NextRun string
Duration string
IsRecurring string
Params string
}
#+END_SRC
MIT