rakanalh / Scheduler
Projects that are alternatives of or similar to Scheduler
- Go Task Scheduler [[https://travis-ci.org/rakanalh/scheduler][https://img.shields.io/travis/rakanalh/scheduler/master.svg?style=flat-square]] [[http://codecov.io/github/rakanalh/scheduler?branch=master][http://codecov.io/github/rakanalh/scheduler/coverage.svg?branch=master]] [[https://godoc.org/github.com/rakanalh/scheduler][https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square]] [[https://github.com/rakanalh/scheduler/blob/master/LICENSE.txt][https://img.shields.io/badge/License-MIT-orange.svg?style=flat-square]]
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.
** 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:
- Sqlite3
- Redis (Coming soon)
-
Installation #+BEGIN_SRC shell go get github.com/rakanalh/scheduler #+END_SRC
-
How To Use
Instantiate a scheduler as follows:
#+BEGIN_SRC go s := scheduler.New(storage) #+END_SRC
GTS currently supports 2 kinds of storages:
- NoOpStorage: Does nothing #+BEGIN_SRC go noOpStorage := storage.NewNoOpStorage() #+END_SRC
- MemoryStorage: Does nothing #+BEGIN_SRC go memStorage := storage.NewMemoryStorage() #+END_SRC
- SqliteStorage: Persists tasks into a SQLite3 database. #+BEGIN_SRC go sqliteStorage := storage.NewSqlite3Storage() #+END_SRC
Example: #+BEGIN_SRC go storage := storage.NewSqlite3Storage( storage.Sqlite3Config{ DbName: "db.store", }, ) 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
- Examples
The [[https://github.com/rakanalh/scheduler/tree/master/_example/][Examples]] folder contains a bunch of code samples you can look into.
- Custom Storage
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
- TODOs
- [ ] Design a cron-like task schedule for RunEvery method
-
Credit This package is heavily inspired by [[https://github.com/agronholm/apscheduler/][APScheduler]] for Python & [[https://github.com/jasonlvhit/gocron][GoCron]]
-
License
MIT