Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/deepaksinghvi/cdule
cdule (pronounce as Schedule) Golang based scheduler library with database support.
https://github.com/deepaksinghvi/cdule
golang-scheduler quartz quartz-go quartz-golang quartz-scheduler scheduler
Last synced: 14 days ago
JSON representation
cdule (pronounce as Schedule) Golang based scheduler library with database support.
- Host: GitHub
- URL: https://github.com/deepaksinghvi/cdule
- Owner: deepaksinghvi
- License: mit
- Created: 2022-02-12T11:49:51.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2022-11-27T09:17:28.000Z (almost 2 years ago)
- Last Synced: 2024-07-31T20:52:03.451Z (3 months ago)
- Topics: golang-scheduler, quartz, quartz-go, quartz-golang, quartz-scheduler, scheduler
- Language: Go
- Homepage:
- Size: 374 KB
- Stars: 47
- Watchers: 3
- Forks: 9
- Open Issues: 4
-
Metadata Files:
- Readme: Readme.MD
- License: LICENSE
Awesome Lists containing this project
- awesome-go - cdule - Job scheduler library with database support (Job Scheduler / Search and Analytic Databases)
- awesome-go-extra - cdule - 02-12T11:49:51Z|2022-05-01T11:07:37Z| (Job Scheduler / Advanced Console UIs)
README
# cdule (pronounce as Schedule)
![dbschema.png](pkg/doc/cdulelogo.png)Golang based scheduler library with database support.
Users could use any database which is supported by [gorm.io](https://gorm.io/).### To Download the cdule library
```shell
go get github.com/deepaksinghvi/cdule
```### Usage Instruction
In order to schedule jobs with cdule, user needs to
1. Configure persistence
2. Implement cdule.Job Interface &
3. Schedule job with required cron expression.Job will be persisted in the jobs table.\
Next execution would be persisted in schedules tables.\
Job history would be persisted and maintained in job_histories table.## Configuration
User needs to create a resources/config.yml in their project home directory with the followling keys
* cduletype
* dburl
* cduleconsistencycduletype is used to specify whether it is an In-Memory or Database based configuration. Possible values are DATABASE and MEMORY.
dburl is the database connection url.
cduleconsistency is for reserved for future usage.### config.yml for postgressql based configuration
```yaml
cduletype: DATABASE
dburl: postgres://cduleuser:cdulepassword@localhost:5432/cdule?sslmode=disable
cduleconsistency: AT_MOST_ONCE
```### config.yml for sqlite based in-memory configuration
```yaml
cduletype: MEMORY
dburl: /Users/dsinghvi/sqlite.db
cduleconsistency: AT_MOST_ONCE
```## Job Interface Implementation
```go
var testJobData map[string]stringtype TestJob struct {
Job cdule.Job
}func (m TestJob) Execute(jobData map[string]string) {
log.Info("In TestJob")
for k, v := range jobData {
valNum, err := strconv.Atoi(v)
if nil == err {
jobData[k] = strconv.Itoa(valNum + 1)
} else {
log.Error(err)
}}
testJobData = jobData
}func (m TestJob) JobName() string {
return "job.TestJob"
}func (m TestJob) GetJobData() map[string]string {
return testJobData
}
```## Schedule a Job
It is expected that testJob will be Executed five times, once for every minute and program will exit. TestJob jobData map holds the data in the format of map[string]string where gets stored for every execution and gets updated as the next counter value on Execute() method call.```go
cdule := cdule.Cdule{}
cdule.NewCdule()
testJob := TestJob{}
jobData := make(map[string]string)
jobData["one"] = "1"
jobData["two"] = "2"
jobData["three"] = "3"
cdule.NewJob(&testJob, jobData).Build(utils.EveryMinute)time.Sleep(5 * time.Minute)
cdule.StopWatcher()
```### Demo Project
This demo describes how cdule library can be used.https://github.com/deepaksinghvi/cduledemo
### Database Schema
For the sample app, postgresql is used but users can use any db which is supported by gorm.io.
#### DB Tables
* jobs : To store unique jobs.
* job_histories : To store job history with status as result.
* schedules : To store schedule for every next run.
* workers : To store the worker nodes and their health check.![dbschema.png](pkg/doc/dbschema.png)
### Sample Cron
Users can use the pre-defined crons or use their own which are the [standard cron](https://en.wikipedia.org/wiki/Cron) expression
```go
EveryMinute = "0 * * ? * *"
EveryEvenMinute = "0 */2 * ? * *"
EveryUnEvenMinute = "0 1/2 * ? * *"
EveryTwoMinutes = "0 */2 * ? * *"
EveryHourAtMin153045 = "0 15,30,45 * ? * *"
EveryHour = "0 0 * ? * *"
EveryEvenHour = "0 0 0/2 ? * *"
EveryUnEvenHour = "0 0 1/2 ? * *"
EveryThreeHours = "0 0 */3 ? * *"
EveryTwelveHours = "0 0 */12 ? * *"
EveryDayAtMidNight = "0 0 0 * * ?"
EveryDayAtOneAM = "0 0 1 * * ?"
EveryDayAtSixAM = "0 0 6 * * ?"
EverySundayAtNoon = "0 0 12 ? * "
EveryMondayAtNoon = "0 0 12 ? *"
EveryWeekDayAtNoon = "0 0 12 ? * MON-FRI"
EveryWeekEndAtNoon = "0 0 12 ? * SUN,SAT"
EveryMonthOnFirstAtNoon = "0 0 12 1 * ?"
EveryMonthOnSecondAtNoon = "0 0 12 2 * ?"
```### This library is built using
* Cron parser using the library [robfig/cron](https://github.com/robfig/cron)
* ORM usign the library [gorm.io](https://gorm.io/)### Other Reports
pkg.go.dev: https://pkg.go.dev/github.com/deepaksinghvi/cdulegoreportcard.com: https://goreportcard.com/report/github.com/deepaksinghvi/cdule
coverage service link: https://app.codecov.io/gh/deepaksinghvi/cdule