mirror of
https://github.com/Fishwaldo/sched.git
synced 2025-07-06 13:08:50 +00:00
Add Examples + More Verbose Logging
Signed-off-by: Sherif Abdel-Naby <sherifabdlnaby@gmail.com>
This commit is contained in:
parent
cb8f233b4d
commit
8fc48d852e
21 changed files with 1169 additions and 3 deletions
71
examples/main.go
Normal file
71
examples/main.go
Normal file
|
@ -0,0 +1,71 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"github.com/uber-go/tally"
|
||||
promreporter "github.com/uber-go/tally/prometheus"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
defer time.Sleep(2 * time.Second)
|
||||
|
||||
r := promreporter.NewReporter(promreporter.Options{})
|
||||
|
||||
// Note: `promreporter.DefaultSeparator` is "_".
|
||||
// Prometheus doesnt like metrics with "." or "-" in them.
|
||||
promScope, closer := tally.NewRootScope(tally.ScopeOptions{
|
||||
Tags: map[string]string{},
|
||||
CachedReporter: r,
|
||||
Separator: promreporter.DefaultSeparator,
|
||||
}, 1*time.Second)
|
||||
defer closer.Close()
|
||||
|
||||
fixed, _ := sched.NewFixed(1 * time.Second)
|
||||
once, _ := sched.NewOnce(1 * time.Second)
|
||||
fixed2, _ := sched.NewFixed(5 * time.Second)
|
||||
|
||||
schedler1 := sched.NewSchedule("one", once, func() {
|
||||
log.Println("Once Hello World")
|
||||
time.Sleep(1 * time.Second)
|
||||
}, sched.WithLogger(sched.DefaultLogger()), sched.WithConsoleMetrics(10*time.Second))
|
||||
|
||||
schedler2 := sched.NewSchedule("ovrlp", fixed, func() {
|
||||
log.Println("Cron Hello World")
|
||||
time.Sleep(1 * time.Second)
|
||||
}, sched.WithLogger(sched.DefaultLogger()), sched.WithMetrics(promScope))
|
||||
|
||||
schedler3 := sched.NewSchedule("three", fixed2, func() {
|
||||
log.Println("panicking")
|
||||
panic("I panicked :(")
|
||||
}, sched.WithLogger(sched.DefaultLogger()), sched.WithConsoleMetrics(10*time.Second))
|
||||
|
||||
http.Handle("/metrics", r.HTTPHandler())
|
||||
go http.ListenAndServe(":8080", nil)
|
||||
|
||||
schedler1.Start()
|
||||
defer schedler1.Stop()
|
||||
schedler2.Start()
|
||||
defer schedler2.Stop()
|
||||
schedler3.Start()
|
||||
defer schedler3.Stop()
|
||||
|
||||
time.AfterFunc(5*time.Second, func() {
|
||||
schedler1.Stop()
|
||||
})
|
||||
|
||||
// Listen to Signals
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
|
||||
// Termination
|
||||
_ = <-signalChan
|
||||
|
||||
return
|
||||
}
|
143
examples/schedule-console-metrics/README.md
Normal file
143
examples/schedule-console-metrics/README.md
Normal file
|
@ -0,0 +1,143 @@
|
|||
- Output with a job that run every 5s on a fixed schedule and run for a random amount of time no more than 5 S
|
||||
- Some metrics are printed to console every 5s
|
||||
|
||||
## Output
|
||||
|
||||
```json
|
||||
2021-04-10T13:13: 35.554+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "every5s"}
|
||||
2021-04-10T13:13: 35.554+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:13:40+02:00"
|
||||
}
|
||||
2021-04-10T13: 13: 40.556+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:13:45+02:00"}
|
||||
2021-04-10T13: 13:40.556+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "bd21a8a3-a9e7-4d8f-83cd-6412913198d8"}
|
||||
2021/04/10 13: 13: 40 Doing some work for random time...
|
||||
2021/04/10 13: 13: 41 Finished Work.
|
||||
2021-04-10T13: 13: 41.657+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "bd21a8a3-a9e7-4d8f-83cd-6412913198d8", "Duration": "1.101s", "State": "FINISHED"}
|
||||
2021-04-10T13: 13: 41.657+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "1.101133682s", "tags": {"ID": "every5s"}}
|
||||
2021-04-10T13: 13:41.657+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "1.101159753s", "tags": {"ID": "every5s"}}
|
||||
2021-04-10T13: 13: 45.559+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:13:50+02:00"}
|
||||
2021-04-10T13: 13: 45.559+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "484b9a12-610c-43c4-9709-23356d7a434d"}
|
||||
2021/04/10 13: 13: 45 Doing some work for random time...
|
||||
2021/04/10 13: 13: 45 Finished Work.
|
||||
2021-04-10T13: 13: 45.763+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "484b9a12-610c-43c4-9709-23356d7a434d", "Duration": "204ms", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 13: 45.763+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "203.728891ms", "tags": {"ID": "every5s"}}
|
||||
2021-04-10T13: 13: 45.763+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "203.793517ms", "tags": {"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 13: 50.557+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:13:55+02:00"}
|
||||
2021-04-10T13: 13: 50.557+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "905996a9-7fe8-46b3-8e32-938ca18f2d03"
|
||||
}
|
||||
2021/04/10 13: 13: 50 Doing some work for random time...
|
||||
2021/04/10 13: 13: 52 Finished Work.
|
||||
2021-04-10T13:13: 52.757+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "905996a9-7fe8-46b3-8e32-938ca18f2d03", "Duration": "2.2s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 13: 52.757+0200 INFO sched.metrics sched/metric.go:48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "2.200216259s", "tags": {"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 13: 52.757+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "2.200301621s", "tags": {
|
||||
"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 13: 55.558+0200 INFO sched sched/schedule.go:168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:14:00+02:00"}
|
||||
2021-04-10T13:13: 55.558+0200 INFO sched.metrics sched/metric.go: 40 counter sched.runs {"id": "every5s", "name": "sched.runs", "value": 3, "tags": {"ID":"every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 13: 55.558+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "39c3295f-63be-4f4a-b81e-79753bbcc91a"
|
||||
}
|
||||
2021/04/10 13:13: 55 Doing some work for random time...
|
||||
2021-04-10T13: 13: 55.558+0200 INFO sched.metrics sched/metric.go:44 gauge sched.up {"id": "every5s", "name": "sched.up", "value": 1, "tags": {"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021/04/10 13: 13: 55 Finished Work.
|
||||
2021-04-10T13: 13: 55.762+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "39c3295f-63be-4f4a-b81e-79753bbcc91a", "Duration": "204ms", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 13: 55.762+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "203.88384ms", "tags": {"ID": "every5s"}}
|
||||
2021-04-10T13:13: 55.762+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "203.935885ms", "tags": {"ID":"every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 14: 00.555+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:14:05+02:00"}
|
||||
2021-04-10T13: 14: 00.556+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "1cad0ba1-ac35-4c9d-8ffb-794cd2902c66"}
|
||||
2021/04/10 13: 14: 00 Doing some work for random time...
|
||||
2021/04/10 13: 14: 04 Finished Work.
|
||||
2021-04-10T13: 14:04.359+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "1cad0ba1-ac35-4c9d-8ffb-794cd2902c66", "Duration": "3.804s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 14: 04.359+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "3.803781236s", "tags": {"ID": "every5s"}
|
||||
}
|
||||
2021-04-10T13: 14: 04.359+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "3.803831971s", "tags": {
|
||||
"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 14: 05.558+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:14:10+02:00"}
|
||||
2021-04-10T13: 14:05.558+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "8e70617b-8245-4b24-aff1-bf4a823ca6ef"}
|
||||
2021/04/10 13: 14: 05 Doing some work for random time...
|
||||
2021/04/10 13: 14: 07 Finished Work.
|
||||
2021-04-10T13: 14: 07.660+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "8e70617b-8245-4b24-aff1-bf4a823ca6ef", "Duration": "2.102s", "State": "FINISHED"}
|
||||
2021-04-10T13: 14: 07.660+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "2.10165422s", "tags": {"ID": "every5s"}}
|
||||
2021-04-10T13: 14:07.660+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "2.101723938s", "tags": {"ID": "every5s"}}
|
||||
2021-04-10T13: 14: 10.557+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:14:15+02:00"}
|
||||
2021-04-10T13: 14: 10.557+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "b4d3b29e-6d21-43d5-8550-6e462625f7ee"}
|
||||
2021/04/10 13: 14: 10 Doing some work for random time...
|
||||
2021/04/10 13: 14: 11 Finished Work.
|
||||
2021-04-10T13: 14: 11.462+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "b4d3b29e-6d21-43d5-8550-6e462625f7ee", "Duration": "905ms", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 14: 11.462+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "904.904666ms", "tags": {"ID": "every5s"}}
|
||||
2021-04-10T13: 14: 11.462+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "905.002981ms", "tags": {"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 14: 15.558+0200 INFO sched.metrics sched/metric.go: 40 counter sched.runs {"id": "every5s", "name": "sched.runs", "value": 4, "tags": {"ID": "every5s"}}
|
||||
2021-04-10T13: 14: 15.558+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:14:20+02:00"
|
||||
}
|
||||
2021-04-10T13: 14: 15.558+0200 INFO sched sched/schedule.go:193 Job Run Starting {"id": "every5s", "Instance": "ac3ff586-9d77-410a-b493-8274347d8b72"
|
||||
}
|
||||
2021/04/10 13: 14: 15 Doing some work for random time...
|
||||
2021/04/10 13: 14:20 Finished Work.
|
||||
2021-04-10T13: 14: 20.459+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "ac3ff586-9d77-410a-b493-8274347d8b72", "Duration": "4.901s", "State": "FINISHED"}
|
||||
2021-04-10T13: 14: 20.459+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "4.900706131s", "tags": {
|
||||
"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 14: 20.459+0200 INFO sched.metrics sched/metric.go:48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "4.900801476s", "tags": {"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 14: 20.555+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:14:25+02:00"
|
||||
}
|
||||
2021-04-10T13: 14: 20.555+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "1d623dcb-e297-4987-baef-e840479abd06"
|
||||
}
|
||||
2021/04/10 13:14: 20 Doing some work for random time...
|
||||
2021/04/10 13: 14: 22 Finished Work.
|
||||
2021-04-10T13: 14: 22.257+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "1d623dcb-e297-4987-baef-e840479abd06", "Duration": "1.702s", "State": "FINISHED"}
|
||||
2021-04-10T13:14: 22.257+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "1.70196874s", "tags": {"ID":"every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 14: 22.257+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "1.702028643s", "tags": {"ID": "every5s"}}
|
||||
2021-04-10T13:14: 25.557+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:14:30+02:00"
|
||||
}
|
||||
2021-04-10T13: 14: 25.557+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "1ef7274b-c899-4156-a4f2-edb85a6db71a"}
|
||||
2021/04/10 13: 14: 25 Doing some work for random time...
|
||||
2021-04-10T13: 14: 30.556+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every5s", "After": "5s", "At": "2021-04-10T13:14:35+02:00"}
|
||||
2021-04-10T13: 14: 30.556+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every5s", "Instance": "aface894-ff68-4e3c-8c72-0f0d8d1a4838"}
|
||||
2021/04/10 13: 14: 30 Doing some work for random time...
|
||||
2021/04/10 13: 14: 30 Finished Work.
|
||||
2021-04-10T13: 14:30.557+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "1ef7274b-c899-4156-a4f2-edb85a6db71a", "Duration": "5s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 14: 30.557+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "5.000234092s", "tags": {"ID": "every5s"}
|
||||
}
|
||||
2021-04-10T13: 14: 30.557+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "5.00025765s", "tags": {
|
||||
"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 14: 32.869+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "every5s"}
|
||||
2021-04-10T13: 14:32.869+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "every5s"}
|
||||
2021-04-10T13:14: 32.869+0200 INFO sched sched/schedule.go: 171 Job Next Run Canceled {"id": "every5s", "At": "2021-04-10T13:14:35+02:00"
|
||||
}
|
||||
2021/04/10 13: 14: 34 Finished Work.
|
||||
2021-04-10T13: 14: 34.057+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every5s", "Instance": "aface894-ff68-4e3c-8c72-0f0d8d1a4838", "Duration": "3.501s", "State": "FINISHED"}
|
||||
2021-04-10T13: 14: 34.057+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "every5s", "name": "sched.run_actual_elapsed_time", "interval": "3.50128391s", "tags": {
|
||||
"ID": "every5s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 14: 34.057+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "every5s", "name": "sched.run_total_elapsed_time", "interval": "3.501411708s", "tags": {"ID": "every5s"}
|
||||
}
|
||||
2021-04-10T13: 14: 34.057+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {"id": "every5s"
|
||||
}
|
||||
```
|
43
examples/schedule-console-metrics/main.go
Normal file
43
examples/schedule-console-metrics/main.go
Normal file
|
@ -0,0 +1,43 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"log"
|
||||
"math/rand"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
fixedEvery5s, err := sched.NewFixed(5 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid interval: %s", err.Error()))
|
||||
}
|
||||
|
||||
job := func() {
|
||||
log.Println("Doing some work for random time...")
|
||||
time.Sleep(time.Duration(int(rand.Int63n(50)+1)*100) * time.Millisecond)
|
||||
log.Println("Finished Work.")
|
||||
}
|
||||
|
||||
// Create Schedule
|
||||
schedule := sched.NewSchedule("every5s", fixedEvery5s, job, sched.WithLogger(sched.DefaultLogger()),
|
||||
sched.WithConsoleMetrics(20*time.Second))
|
||||
|
||||
// Start Schedule
|
||||
schedule.Start()
|
||||
|
||||
// Listen to CTRL + C And indefintly wait shutdown.
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
_ = <-signalChan
|
||||
|
||||
// Stop before shutting down.
|
||||
schedule.Stop()
|
||||
|
||||
return
|
||||
}
|
51
examples/schedule-cron/README.md
Normal file
51
examples/schedule-cron/README.md
Normal file
|
@ -0,0 +1,51 @@
|
|||
# Output with a cron expression that run every minute
|
||||
|
||||
## Output for 3 minutes
|
||||
|
||||
```json
|
||||
2021-04-10T12:30: 13.132+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "cron"}
|
||||
2021-04-10T12:30: 13.132+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "47s", "At": "2021-04-10T12:31:00+02:00"
|
||||
}
|
||||
2021-04-10T12: 31: 00.000+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "1m0s", "At": "2021-04-10T12:32:00+02:00"}
|
||||
2021-04-10T12: 31:00.000+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron", "Instance": "8e1044ab-20b6-4acf-8a15-e06c0418522c"}
|
||||
2021/04/10 12: 31: 00 Doing some work...
|
||||
2021/04/10 12: 31: 01 Finished Work.
|
||||
2021-04-10T12: 31: 01.001+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron", "Instance": "8e1044ab-20b6-4acf-8a15-e06c0418522c", "Duration": "1.001s", "State": "FINISHED"}
|
||||
2021-04-10T12:32: 00.002+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "1m0s", "At": "2021-04-10T12:33:00+02:00"
|
||||
}
|
||||
2021-04-10T12: 32: 00.002+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron", "Instance": "baae94eb-f818-4b34-a1f4-45b521a360a1"}
|
||||
2021/04/10 12: 32: 00 Doing some work...
|
||||
2021/04/10 12: 32: 01 Finished Work.
|
||||
2021-04-10T12:32: 01.005+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron", "Instance": "baae94eb-f818-4b34-a1f4-45b521a360a1", "Duration": "1.003s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T12: 33: 00.001+0200 INFO sched sched/schedule.go:168 Job Next Run Scheduled {"id": "cron", "After": "1m0s", "At": "2021-04-10T12:34:00+02:00"}
|
||||
2021-04-10T12:33: 00.001+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron", "Instance": "71c8f0bf-3624-4a92-909c-b4149f3c62a3"}
|
||||
2021/04/10 12: 33: 00 Doing some work...
|
||||
2021/04/10 12: 33: 01 Finished Work.
|
||||
2021-04-10T12: 33: 01.004+0200 INFO sched sched/schedule.go:208 Job Finished {"id": "cron", "Instance": "71c8f0bf-3624-4a92-909c-b4149f3c62a3", "Duration": "1.003s", "State": "FINISHED"}
|
||||
|
||||
|
||||
```
|
||||
|
||||
## Output With CTRL+C
|
||||
|
||||
```json
|
||||
2021-04-10T12:28: 45.591+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "cron"}
|
||||
2021-04-10T12:28: 45.592+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "14s", "At": "2021-04-10T12:29:00+02:00"
|
||||
}
|
||||
2021-04-10T12: 29: 00.000+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "1m0s", "At": "2021-04-10T12:30:00+02:00"}
|
||||
2021-04-10T12: 29:00.000+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron", "Instance": "786540f1-594b-44a0-9a66-7181619e38a6"}
|
||||
2021/04/10 12: 29: 00 Doing some work...
|
||||
CTRL+C
|
||||
2021-04-10T12: 29: 00.567+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "cron"}
|
||||
2021-04-10T12: 29: 00.567+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "cron"
|
||||
}
|
||||
2021-04-10T12: 29: 00.567+0200 INFO sched sched/schedule.go: 171 Job Next Run Canceled {"id": "cron", "At": "2021-04-10T12:30:00+02:00"
|
||||
}
|
||||
2021/04/10 12: 29: 01 Finished Work.
|
||||
2021-04-10T12: 29:01.000+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron", "Instance": "786540f1-594b-44a0-9a66-7181619e38a6", "Duration": "1s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T12: 29: 01.000+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {
|
||||
"id": "cron"
|
||||
}
|
||||
```
|
46
examples/schedule-cron/main.go
Normal file
46
examples/schedule-cron/main.go
Normal file
|
@ -0,0 +1,46 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
cronTimer, err := sched.NewCron("* * * * *")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid cron expression: %s", err.Error()))
|
||||
}
|
||||
|
||||
job := func() {
|
||||
log.Println("Doing some work...")
|
||||
time.Sleep(1 * time.Second)
|
||||
log.Println("Finished Work.")
|
||||
}
|
||||
|
||||
// Create Schedule
|
||||
schedule := sched.NewSchedule("cron", cronTimer, job, sched.WithLogger(sched.DefaultLogger()))
|
||||
|
||||
// Start Schedule
|
||||
schedule.Start()
|
||||
|
||||
// Stop schedule after 5 Minutes
|
||||
time.AfterFunc(5*time.Minute, func() {
|
||||
schedule.Stop()
|
||||
})
|
||||
|
||||
// Listen to CTRL + C
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
_ = <-signalChan
|
||||
|
||||
// Stop before shutting down.
|
||||
schedule.Stop()
|
||||
|
||||
return
|
||||
}
|
67
examples/schedule-fixed/README.md
Normal file
67
examples/schedule-fixed/README.md
Normal file
|
@ -0,0 +1,67 @@
|
|||
# Output with a job that run every 30s on a fixed schedule
|
||||
|
||||
## Output
|
||||
|
||||
```json
|
||||
2021-04-10T12:58: 48.724+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "every30s"}
|
||||
2021-04-10T12:58: 48.725+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T12:59:18+02:00"
|
||||
}
|
||||
2021-04-10T12: 59: 18.729+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T12:59:48+02:00"}
|
||||
2021-04-10T12: 59:18.729+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every30s", "Instance": "e05aa702-f11c-46ba-8d7c-6ae4049c382d"}
|
||||
2021/04/10 12: 59: 18 Doing some work...
|
||||
2021/04/10 12: 59: 19 Finished Work.
|
||||
2021-04-10T12: 59: 19.733+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every30s", "Instance": "e05aa702-f11c-46ba-8d7c-6ae4049c382d", "Duration": "1.004s", "State": "FINISHED"}
|
||||
2021-04-10T12:59: 48.724+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T13:00:18+02:00"
|
||||
}
|
||||
2021-04-10T12: 59: 48.724+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every30s", "Instance": "80ed574e-e4fc-4a9f-9741-6eda96ebd470"}
|
||||
2021/04/10 12: 59: 48 Doing some work...
|
||||
2021/04/10 12: 59: 49 Finished Work.
|
||||
2021-04-10T12:59: 49.727+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every30s", "Instance": "80ed574e-e4fc-4a9f-9741-6eda96ebd470", "Duration": "1.003s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 00: 18.726+0200 INFO sched sched/schedule.go:168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T13:00:48+02:00"}
|
||||
2021-04-10T13:00: 18.726+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every30s", "Instance": "6bc1402c-a5e4-4634-9e49-acaaa6dcb5d0"}
|
||||
2021/04/10 13: 00: 18 Doing some work...
|
||||
2021/04/10 13: 00: 19 Finished Work.
|
||||
2021-04-10T13: 00: 19.729+0200 INFO sched sched/schedule.go:208 Job Finished {"id": "every30s", "Instance": "6bc1402c-a5e4-4634-9e49-acaaa6dcb5d0", "Duration": "1.003s", "State": "FINISHED"}
|
||||
2021-04-10T13: 00: 48.725+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T13:01:18+02:00"
|
||||
}
|
||||
2021-04-10T13: 00: 48.725+0200 INFO sched sched/schedule.go:193 Job Run Starting {"id": "every30s", "Instance": "ed82fdd5-63a0-4fb4-b6a3-7fb74a973d1a"
|
||||
}
|
||||
2021/04/10 13: 00: 48 Doing some work...
|
||||
2021/04/10 13: 00: 49 Finished Work.
|
||||
2021-04-10T13: 00: 49.730+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every30s", "Instance": "ed82fdd5-63a0-4fb4-b6a3-7fb74a973d1a", "Duration": "1.005s", "State": "FINISHED"}
|
||||
2021-04-10T13: 01: 18.724+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T13:01:48+02:00"}
|
||||
2021-04-10T13: 01: 18.724+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every30s", "Instance": "a48eb5fa-2f62-4e9d-ae4e-550fbedc0cd6"}
|
||||
2021/04/10 13: 01: 18 Doing some work...
|
||||
2021/04/10 13: 01: 19 Finished Work.
|
||||
2021-04-10T13: 01: 19.728+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every30s", "Instance": "a48eb5fa-2f62-4e9d-ae4e-550fbedc0cd6", "Duration": "1.003s", "State": "FINISHED"}
|
||||
2021-04-10T13: 01: 48.725+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T13:02:18+02:00"}
|
||||
2021-04-10T13: 01: 48.725+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every30s", "Instance": "2347a38f-82d8-45aa-abb9-1f5192f53a09"
|
||||
}
|
||||
2021/04/10 13: 01:48 Doing some work...
|
||||
2021/04/10 13: 01: 49 Finished Work.
|
||||
2021-04-10T13: 01: 49.725+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every30s", "Instance": "2347a38f-82d8-45aa-abb9-1f5192f53a09", "Duration": "1s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 02: 18.721+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T13:02:48+02:00"}
|
||||
2021-04-10T13: 02: 18.721+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every30s", "Instance": "b4f52aa8-999a-4d46-8cd0-f49c91b22ca3"}
|
||||
2021/04/10 13: 02: 18 Doing some work...
|
||||
2021/04/10 13: 02:19 Finished Work.
|
||||
2021-04-10T13: 02: 19.722+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every30s", "Instance": "b4f52aa8-999a-4d46-8cd0-f49c91b22ca3", "Duration": "1.001s", "State": "FINISHED"}
|
||||
2021-04-10T13: 02: 48.721+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every30s", "Instance": "e2c32b53-556c-48ca-98b0-9d39aa0fbd61"
|
||||
}
|
||||
2021-04-10T13:02: 48.721+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T13:03:18+02:00"
|
||||
}
|
||||
2021/04/10 13:02: 48 Doing some work...
|
||||
2021/04/10 13: 02: 49 Finished Work.
|
||||
2021-04-10T13: 02: 49.722+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every30s", "Instance": "e2c32b53-556c-48ca-98b0-9d39aa0fbd61", "Duration": "1s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 03: 18.719+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every30s", "After": "30s", "At": "2021-04-10T13:03:48+02:00"}
|
||||
2021-04-10T13: 03: 18.719+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every30s", "Instance": "6a8aa794-3c9c-4ffe-a2a6-c4b78f31dd57"
|
||||
}
|
||||
2021/04/10 13: 03: 18 Doing some work...
|
||||
2021/04/10 13:03: 19 Finished Work.
|
||||
...
|
||||
...
|
||||
...
|
||||
|
||||
```
|
41
examples/schedule-fixed/main.go
Normal file
41
examples/schedule-fixed/main.go
Normal file
|
@ -0,0 +1,41 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
fixedTimer30second, err := sched.NewFixed(30 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid interval: %s", err.Error()))
|
||||
}
|
||||
|
||||
job := func() {
|
||||
log.Println("Doing some work...")
|
||||
time.Sleep(1 * time.Second)
|
||||
log.Println("Finished Work.")
|
||||
}
|
||||
|
||||
// Create Schedule
|
||||
schedule := sched.NewSchedule("every30s", fixedTimer30second, job, sched.WithLogger(sched.DefaultLogger()))
|
||||
|
||||
// Start Schedule
|
||||
schedule.Start()
|
||||
|
||||
// Listen to CTRL + C And indefintly wait shutdown.
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
_ = <-signalChan
|
||||
|
||||
// Stop before shutting down.
|
||||
schedule.Stop()
|
||||
|
||||
return
|
||||
}
|
134
examples/schedule-four-mixed-timers/README.md
Normal file
134
examples/schedule-four-mixed-timers/README.md
Normal file
|
@ -0,0 +1,134 @@
|
|||
# 4 Schedules
|
||||
|
||||
1. Cron Every Minute
|
||||
2. Cron Every 5 Minutes
|
||||
3. Fixed Interval Every 30 Secs
|
||||
4. *Once* after 10 Secs from schedule start.
|
||||
|
||||
## Output
|
||||
|
||||
```json
|
||||
2021-04-10T12:46: 09.307+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "cron-every-minute"}
|
||||
2021-04-10T12:46: 09.307+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "cron-every-5minute"}
|
||||
2021-04-10T12:46: 09.307+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "fixed-every-30seconds"}
|
||||
2021-04-10T12:46: 09.307+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "once-after-10seconds"}
|
||||
2021-04-10T12:46: 09.307+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "once-after-10seconds", "After": "10s", "At": "2021-04-10T12:46:19+02:00"
|
||||
}
|
||||
2021-04-10T12: 46: 09.307+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron-every-minute", "After": "51s", "At": "2021-04-10T12:47:00+02:00"}
|
||||
2021-04-10T12: 46:09.307+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "fixed-every-30seconds", "After": "30s", "At": "2021-04-10T12:46:39+02:00"
|
||||
}
|
||||
2021-04-10T12: 46: 09.307+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron-every-5minute", "After": "3m51s", "At": "2021-04-10T12:50:00+02:00"}
|
||||
2021-04-10T12: 46: 19.311+0200 INFO sched sched/schedule.go: 162 No more Jobs will be scheduled {"id": "once-after-10seconds"}
|
||||
2021-04-10T12: 46: 19.311+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "once-after-10seconds"}
|
||||
2021-04-10T12: 46:19.311+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "once-after-10seconds"}
|
||||
2021-04-10T12:46: 19.312+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "once-after-10seconds", "Instance": "6f971652-8394-47d6-86ff-3173cde2b6a1"}
|
||||
2021/04/10 12: 46: 19 job once after 10 seconds Doing some work...
|
||||
2021/04/10 12: 46: 20 job once after 10 seconds Finished Work.
|
||||
2021-04-10T12: 46: 20.314+0200 INFO sched sched/schedule.go:208 Job Finished {"id": "once-after-10seconds", "Instance": "6f971652-8394-47d6-86ff-3173cde2b6a1", "Duration": "1.002s", "State": "FINISHED"}
|
||||
2021-04-10T12: 46: 20.314+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {"id": "once-after-10seconds"}
|
||||
2021-04-10T12: 46: 20.314+0200 INFO sched sched/schedule.go: 153 Job Schedule Finished {"id": "once-after-10seconds"}
|
||||
2021-04-10T12: 46: 39.309+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "fixed-every-30seconds", "After": "30s", "At": "2021-04-10T12:47:09+02:00"
|
||||
}
|
||||
2021-04-10T12: 46: 39.309+0200 INFO sched sched/schedule.go:193 Job Run Starting {"id": "fixed-every-30seconds", "Instance": "bf92e3f5-ea61-4044-b6a4-12d1ca654eec"
|
||||
}
|
||||
2021/04/10 12: 46: 39 job every 30 seconds Doing some work...
|
||||
2021/04/10 12: 46: 40 job every 30 seconds Finished Work.
|
||||
2021-04-10T12:46: 40.311+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "fixed-every-30seconds", "Instance": "bf92e3f5-ea61-4044-b6a4-12d1ca654eec", "Duration": "1.001s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T12: 46: 59.999+0200 INFO sched sched/schedule.go:168 Job Next Run Scheduled {"id": "cron-every-minute", "After": "0s", "At": "2021-04-10T12:47:00+02:00"}
|
||||
2021-04-10T12:46: 59.999+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron-every-minute", "Instance": "fc39385f-5c52-4402-aec0-3ee0ec08f3d2"}
|
||||
2021/04/10 12: 46: 59 job cron every minute Doing some work...
|
||||
2021-04-10T12: 47: 00.000+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron-every-minute", "After": "1m0s", "At": "2021-04-10T12:48:00+02:00"}
|
||||
2021-04-10T12: 47: 00.000+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron-every-minute", "Instance": "b4911daa-5412-4816-9636-039af5f897ff"
|
||||
}
|
||||
2021/04/10 12: 47: 00 job cron every minute Doing some work...
|
||||
2021/04/10 12: 47: 01 job cron every minute Finished Work.
|
||||
2021/04/10 12: 47: 01 job cron every minute Finished Work.
|
||||
2021-04-10T12: 47: 01.002+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron-every-minute", "Instance": "b4911daa-5412-4816-9636-039af5f897ff", "Duration": "1.002s", "State": "FINISHED"}
|
||||
2021-04-10T12: 47:01.002+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron-every-minute", "Instance": "fc39385f-5c52-4402-aec0-3ee0ec08f3d2", "Duration": "1.003s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T12: 47: 09.309+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "fixed-every-30seconds", "After": "30s", "At": "2021-04-10T12:47:39+02:00"}
|
||||
2021-04-10T12: 47:09.309+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "fixed-every-30seconds", "Instance": "bd50d728-807e-4d0e-aed3-45044e4b925a"}
|
||||
2021/04/10 12: 47: 09 job every 30 seconds Doing some work...
|
||||
2021/04/10 12: 47: 10 job every 30 seconds Finished Work.
|
||||
2021-04-10T12: 47: 10.309+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "fixed-every-30seconds", "Instance": "bd50d728-807e-4d0e-aed3-45044e4b925a", "Duration": "1s", "State": "FINISHED"}
|
||||
2021-04-10T12: 47:39.306+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "fixed-every-30seconds", "After": "30s", "At": "2021-04-10T12:48:09+02:00"
|
||||
}
|
||||
2021-04-10T12: 47: 39.306+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "fixed-every-30seconds", "Instance": "282dea9f-b64a-48ab-9ce8-3dcf533d95e4"}
|
||||
2021/04/10 12: 47: 39 job every 30 seconds Doing some work...
|
||||
2021/04/10 12: 47: 40 job every 30 seconds Finished Work.
|
||||
2021-04-10T12: 47: 40.307+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "fixed-every-30seconds", "Instance": "282dea9f-b64a-48ab-9ce8-3dcf533d95e4", "Duration": "1.001s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T12: 48: 00.002+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron-every-minute", "After": "1m0s", "At": "2021-04-10T12:49:00+02:00"}
|
||||
2021-04-10T12: 48: 00.002+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron-every-minute", "Instance": "9311f3ef-3a43-4fe1-8c8d-740616f42294"
|
||||
}
|
||||
2021/04/10 12: 48: 00 job cron every minute Doing some work...
|
||||
2021/04/10 12: 48: 01 job cron every minute Finished Work.
|
||||
2021-04-10T12: 48: 01.007+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron-every-minute", "Instance": "9311f3ef-3a43-4fe1-8c8d-740616f42294", "Duration": "1.004s", "State": "FINISHED"}
|
||||
2021-04-10T12: 48: 09.304+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "fixed-every-30seconds", "After": "30s", "At": "2021-04-10T12:48:39+02:00"
|
||||
}
|
||||
2021-04-10T12: 48: 09.304+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "fixed-every-30seconds", "Instance": "083d7198-1981-4542-9677-f837509a346c"
|
||||
}
|
||||
2021/04/10 12:48: 09 job every 30 seconds Doing some work...
|
||||
2021/04/10 12: 48: 10 job every 30 seconds Finished Work.
|
||||
2021-04-10T12: 48: 10.308+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "fixed-every-30seconds", "Instance": "083d7198-1981-4542-9677-f837509a346c", "Duration": "1.004s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T12: 48: 39.333+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "fixed-every-30seconds", "After": "30s", "At": "2021-04-10T12:49:09+02:00"}
|
||||
2021-04-10T12: 48: 39.333+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "fixed-every-30seconds", "Instance": "8b8cffcb-b026-4383-813d-3f704d6d37a6"}
|
||||
2021/04/10 12: 48: 39 job every 30 seconds Doing some work...
|
||||
2021/04/10 12: 48: 40 job every 30 seconds Finished Work.
|
||||
2021-04-10T12: 48: 40.338+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "fixed-every-30seconds", "Instance": "8b8cffcb-b026-4383-813d-3f704d6d37a6", "Duration": "1.004s", "State": "FINISHED"}
|
||||
2021-04-10T12: 49: 00.035+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron-every-minute", "After": "1m0s", "At": "2021-04-10T12:50:00+02:00"}
|
||||
2021-04-10T12: 49: 00.035+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron-every-minute", "Instance": "a4c6a479-2138-4037-b613-8adcae1e882d"
|
||||
}
|
||||
2021/04/10 12: 49:00 job cron every minute Doing some work...
|
||||
2021/04/10 12: 49: 01 job cron every minute Finished Work.
|
||||
2021-04-10T12: 49: 01.039+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron-every-minute", "Instance": "a4c6a479-2138-4037-b613-8adcae1e882d", "Duration": "1.004s", "State": "FINISHED"}
|
||||
2021-04-10T12: 49: 09.344+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "fixed-every-30seconds", "After": "30s", "At": "2021-04-10T12:49:39+02:00"}
|
||||
2021-04-10T12: 49: 09.344+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "fixed-every-30seconds", "Instance": "6f17958b-2e83-4d81-808d-9432900cf24e"}
|
||||
2021/04/10 12: 49: 09 job every 30 seconds Doing some work...
|
||||
2021/04/10 12:49: 10 job every 30 seconds Finished Work.
|
||||
2021-04-10T12: 49: 10.349+0200 INFO sched sched/schedule.go:208 Job Finished {"id": "fixed-every-30seconds", "Instance": "6f17958b-2e83-4d81-808d-9432900cf24e", "Duration": "1.004s", "State": "FINISHED"}
|
||||
2021-04-10T12: 49: 39.346+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "fixed-every-30seconds", "After": "30s", "At": "2021-04-10T12:50:09+02:00"
|
||||
}
|
||||
2021-04-10T12: 49: 39.346+0200 INFO sched sched/schedule.go:193 Job Run Starting {"id": "fixed-every-30seconds", "Instance": "11da6889-dee3-4e1c-8c52-af2e2618999a"
|
||||
}
|
||||
2021/04/10 12: 49: 39 job every 30 seconds Doing some work...
|
||||
2021/04/10 12: 49: 40 job every 30 seconds Finished Work.
|
||||
2021-04-10T12:49: 40.348+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "fixed-every-30seconds", "Instance": "11da6889-dee3-4e1c-8c52-af2e2618999a", "Duration": "1.003s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T12: 50: 00.003+0200 INFO sched sched/schedule.go:168 Job Next Run Scheduled {"id": "cron-every-minute", "After": "1m0s", "At": "2021-04-10T12:51:00+02:00"}
|
||||
2021-04-10T12:50: 00.003+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron-every-minute", "Instance": "35df9a8c-7900-4f79-943f-a0f0efe86032"}
|
||||
2021/04/10 12: 50: 00 job cron every minute Doing some work...
|
||||
2021-04-10T12: 50: 00.035+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron-every-5minute", "After": "5m0s", "At": "2021-04-10T12:55:00+02:00"}
|
||||
2021-04-10T12: 50: 00.035+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron-every-5minute", "Instance": "0ba1a33f-e75f-4273-ace7-98a6c51113ff"
|
||||
}
|
||||
2021/04/10 12: 50: 00 job cron every 5 minute Doing some work...
|
||||
2021/04/10 12: 50: 01 job cron every minute Finished Work.
|
||||
2021-04-10T12: 50: 01.003+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron-every-minute", "Instance": "35df9a8c-7900-4f79-943f-a0f0efe86032", "Duration": "1.001s", "State": "FINISHED"
|
||||
}
|
||||
2021/04/10 12: 50:01 job cron every 5 minute Finished Work.
|
||||
2021-04-10T12:50: 01.037+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron-every-5minute", "Instance": "0ba1a33f-e75f-4273-ace7-98a6c51113ff", "Duration": "1.002s", "State": "FINISHED"
|
||||
}
|
||||
CTRL+C
|
||||
2021-04-10T12: 50: 08.092+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "cron-every-minute"}
|
||||
2021-04-10T12: 50: 08.092+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "cron-every-minute"
|
||||
}
|
||||
2021-04-10T12: 50: 08.092+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {"id": "cron-every-minute"
|
||||
}
|
||||
2021-04-10T12: 50: 08.092+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "cron-every-5minute"}
|
||||
2021-04-10T12: 50: 08.092+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "cron-every-5minute"
|
||||
}
|
||||
2021-04-10T12: 50: 08.092+0200 INFO sched sched/schedule.go: 171 Job Next Run Canceled {"id": "cron-every-minute", "At": "2021-04-10T12:51:00+02:00"}
|
||||
2021-04-10T12: 50: 08.092+0200 INFO sched sched/schedule.go:133 Job Schedule Stopped {
|
||||
"id": "cron-every-5minute"
|
||||
}
|
||||
2021-04-10T12: 50: 08.092+0200 INFO sched sched/schedule.go:171 Job Next Run Canceled {"id": "cron-every-5minute", "At": "2021-04-10T12:55:00+02:00"}
|
||||
2021-04-10T12: 50: 08.092+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "fixed-every-30seconds"
|
||||
}
|
||||
2021-04-10T12: 50: 08.093+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "fixed-every-30seconds"}
|
||||
2021-04-10T12: 50: 08.093+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {"id": "fixed-every-30seconds"}
|
||||
2021-04-10T12: 50: 08.093+0200 INFO sched sched/schedule.go: 171 Job Next Run Canceled {"id": "fixed-every-30seconds", "At": "2021-04-10T12:50:09+02:00"}
|
||||
|
||||
```
|
||||
|
67
examples/schedule-four-mixed-timers/main.go
Normal file
67
examples/schedule-four-mixed-timers/main.go
Normal file
|
@ -0,0 +1,67 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
job := func(id string) func() {
|
||||
return func() {
|
||||
log.Println(id + "\t Doing some work...")
|
||||
time.Sleep(1 * time.Second)
|
||||
log.Println(id + "\t Finished Work.")
|
||||
}
|
||||
}
|
||||
|
||||
cronTimer, err := sched.NewCron("* * * * *")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid cron expression: %s", err.Error()))
|
||||
}
|
||||
|
||||
cronTimer5, err := sched.NewCron("*/5 * * * *")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid cron expression: %s", err.Error()))
|
||||
}
|
||||
|
||||
fixedTimer30second, err := sched.NewFixed(30 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid interval: %s", err.Error()))
|
||||
}
|
||||
|
||||
onceAfter10s, err := sched.NewOnce(10 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid delay: %s", err.Error()))
|
||||
}
|
||||
|
||||
// Create Schedule
|
||||
schedule0 := sched.NewSchedule("cron-every-minute", cronTimer, job("job cron every minute"), sched.WithLogger(sched.DefaultLogger()))
|
||||
schedule1 := sched.NewSchedule("cron-every-5minute", cronTimer5, job("job cron every 5 minute"), sched.WithLogger(sched.DefaultLogger()))
|
||||
schedule2 := sched.NewSchedule("fixed-every-30seconds", fixedTimer30second, job("job every 30 seconds"), sched.WithLogger(sched.DefaultLogger()))
|
||||
schedule3 := sched.NewSchedule("once-after-10seconds", onceAfter10s, job("job once after 10 seconds"), sched.WithLogger(sched.DefaultLogger()))
|
||||
|
||||
// Start Schedule
|
||||
schedule0.Start()
|
||||
schedule1.Start()
|
||||
schedule2.Start()
|
||||
schedule3.Start()
|
||||
|
||||
// Listen to CTRL + C
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
_ = <-signalChan
|
||||
|
||||
// Stop before shutting down.
|
||||
schedule0.Stop()
|
||||
schedule1.Stop()
|
||||
schedule2.Stop()
|
||||
schedule3.Stop()
|
||||
|
||||
return
|
||||
}
|
51
examples/schedule-once/README.md
Normal file
51
examples/schedule-once/README.md
Normal file
|
@ -0,0 +1,51 @@
|
|||
# Output with a cron expression that run every minute
|
||||
|
||||
## Output for 3 minutes
|
||||
|
||||
```json
|
||||
2021-04-10T12:30: 13.132+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "cron"}
|
||||
2021-04-10T12:30: 13.132+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "47s", "At": "2021-04-10T12:31:00+02:00"
|
||||
}
|
||||
2021-04-10T12: 31: 00.000+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "1m0s", "At": "2021-04-10T12:32:00+02:00"}
|
||||
2021-04-10T12: 31:00.000+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron", "Instance": "8e1044ab-20b6-4acf-8a15-e06c0418522c"}
|
||||
2021/04/10 12: 31: 00 Doing some work...
|
||||
2021/04/10 12: 31: 01 Finished Work.
|
||||
2021-04-10T12: 31: 01.001+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron", "Instance": "8e1044ab-20b6-4acf-8a15-e06c0418522c", "Duration": "1.001s", "State": "FINISHED"}
|
||||
2021-04-10T12:32: 00.002+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "1m0s", "At": "2021-04-10T12:33:00+02:00"
|
||||
}
|
||||
2021-04-10T12: 32: 00.002+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron", "Instance": "baae94eb-f818-4b34-a1f4-45b521a360a1"}
|
||||
2021/04/10 12: 32: 00 Doing some work...
|
||||
2021/04/10 12: 32: 01 Finished Work.
|
||||
2021-04-10T12:32: 01.005+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron", "Instance": "baae94eb-f818-4b34-a1f4-45b521a360a1", "Duration": "1.003s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T12: 33: 00.001+0200 INFO sched sched/schedule.go:168 Job Next Run Scheduled {"id": "cron", "After": "1m0s", "At": "2021-04-10T12:34:00+02:00"}
|
||||
2021-04-10T12:33: 00.001+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron", "Instance": "71c8f0bf-3624-4a92-909c-b4149f3c62a3"}
|
||||
2021/04/10 12: 33: 00 Doing some work...
|
||||
2021/04/10 12: 33: 01 Finished Work.
|
||||
2021-04-10T12: 33: 01.004+0200 INFO sched sched/schedule.go:208 Job Finished {"id": "cron", "Instance": "71c8f0bf-3624-4a92-909c-b4149f3c62a3", "Duration": "1.003s", "State": "FINISHED"}
|
||||
|
||||
|
||||
```
|
||||
|
||||
## Output With CTRL+C
|
||||
|
||||
```json
|
||||
2021-04-10T12:28: 45.591+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "cron"}
|
||||
2021-04-10T12:28: 45.592+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "14s", "At": "2021-04-10T12:29:00+02:00"
|
||||
}
|
||||
2021-04-10T12: 29: 00.000+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cron", "After": "1m0s", "At": "2021-04-10T12:30:00+02:00"}
|
||||
2021-04-10T12: 29:00.000+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "cron", "Instance": "786540f1-594b-44a0-9a66-7181619e38a6"}
|
||||
2021/04/10 12: 29: 00 Doing some work...
|
||||
CTRL+C
|
||||
2021-04-10T12: 29: 00.567+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "cron"}
|
||||
2021-04-10T12: 29: 00.567+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "cron"
|
||||
}
|
||||
2021-04-10T12: 29: 00.567+0200 INFO sched sched/schedule.go: 171 Job Next Run Canceled {"id": "cron", "At": "2021-04-10T12:30:00+02:00"
|
||||
}
|
||||
2021/04/10 12: 29: 01 Finished Work.
|
||||
2021-04-10T12: 29:01.000+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "cron", "Instance": "786540f1-594b-44a0-9a66-7181619e38a6", "Duration": "1s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T12: 29: 01.000+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {
|
||||
"id": "cron"
|
||||
}
|
||||
```
|
41
examples/schedule-once/main.go
Normal file
41
examples/schedule-once/main.go
Normal file
|
@ -0,0 +1,41 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
fixedTimer5second, err := sched.NewFixed(30 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid interval: %s", err.Error()))
|
||||
}
|
||||
|
||||
job := func() {
|
||||
log.Println("Doing some work...")
|
||||
time.Sleep(1 * time.Second)
|
||||
log.Println("Finished Work.")
|
||||
}
|
||||
|
||||
// Create Schedule
|
||||
schedule := sched.NewSchedule("every30s", fixedTimer5second, job, sched.WithLogger(sched.DefaultLogger()))
|
||||
|
||||
// Start Schedule
|
||||
schedule.Start()
|
||||
|
||||
// Listen to CTRL + C And indefintly wait shutdown.
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
_ = <-signalChan
|
||||
|
||||
// Stop before shutting down.
|
||||
schedule.Stop()
|
||||
|
||||
return
|
||||
}
|
49
examples/schedule-overlapping/README.md
Normal file
49
examples/schedule-overlapping/README.md
Normal file
|
@ -0,0 +1,49 @@
|
|||
# Output with a job that run every 30s on a fixed schedule
|
||||
|
||||
## Output
|
||||
|
||||
```json
|
||||
2021-04-10T13:35: 42.078+0200 INFO sched sched/schedule.go: 97 Job Schedule Started {"id": "every1Sec"}
|
||||
2021/04/10 13: 35: 42 Stopping schedule Automatically after 5 seconds
|
||||
2021-04-10T13: 35: 42.078+0200 INFO sched sched/schedule.go: 172 Job Next Run Scheduled {"id": "every1Sec", "After": "1s", "At": "2021-04-10T13:35:43+02:00"
|
||||
}
|
||||
2021-04-10T13: 35: 43.081+0200 INFO sched sched/schedule.go:172 Job Next Run Scheduled {"id": "every1Sec", "After": "1s", "At": "2021-04-10T13:35:44+02:00"}
|
||||
2021-04-10T13:35: 43.081+0200 INFO sched sched/schedule.go: 197 Job Run Starting {"id": "every1Sec", "Instance": "12e1c9f3-69a7-4a31-8082-7dd40416f00b"}
|
||||
2021/04/10 13: 35: 43 Doing some work for 5 seconds...
|
||||
2021-04-10T13: 35: 44.082+0200 INFO sched sched/schedule.go: 172 Job Next Run Scheduled {"id": "every1Sec", "After": "1s", "At": "2021-04-10T13:35:45+02:00"
|
||||
}
|
||||
2021-04-10T13: 35: 44.082+0200 INFO sched sched/schedule.go: 197 Job Run Starting {"id": "every1Sec", "Instance": "46ccdc9c-1792-4fc6-8e7b-aa269ea8b5a0"
|
||||
}
|
||||
2021/04/10 13:35: 44 Doing some work for 5 seconds...
|
||||
2021-04-10T13: 35: 45.078+0200 INFO sched sched/schedule.go:172 Job Next Run Scheduled {"id": "every1Sec", "After": "1s", "At": "2021-04-10T13:35:46+02:00"}
|
||||
2021-04-10T13:35: 45.078+0200 INFO sched sched/schedule.go: 197 Job Run Starting {"id": "every1Sec", "Instance": "4c663f7a-40a8-47a1-8eaa-4ed52cc80a94"}
|
||||
2021/04/10 13: 35: 45 Doing some work for 5 seconds...
|
||||
2021-04-10T13: 35: 46.079+0200 INFO sched sched/schedule.go: 172 Job Next Run Scheduled {"id": "every1Sec", "After": "1s", "At": "2021-04-10T13:35:47+02:00"
|
||||
}
|
||||
2021-04-10T13: 35: 46.079+0200 INFO sched sched/schedule.go: 197 Job Run Starting {"id": "every1Sec", "Instance": "22a192be-2d42-4840-bbfe-05e28bee1716"
|
||||
}
|
||||
2021/04/10 13:35: 46 Doing some work for 5 seconds...
|
||||
2021-04-10T13: 35: 47.080+0200 INFO sched sched/schedule.go:172 Job Next Run Scheduled {"id": "every1Sec", "After": "1s", "At": "2021-04-10T13:35:48+02:00"}
|
||||
2021-04-10T13:35: 47.080+0200 INFO sched sched/schedule.go: 126 Stopping Schedule... {"id": "every1Sec"}
|
||||
2021-04-10T13: 35: 47.080+0200 INFO sched sched/schedule.go: 132 Waiting for '5' active jobs still running... {"id": "every1Sec"}
|
||||
2021-04-10T13: 35: 47.080+0200 INFO sched sched/schedule.go: 197 Job Run Starting {"id": "every1Sec", "Instance": "08cb1143-c0cc-436c-a7e6-097b0ef4cbf0"
|
||||
}
|
||||
2021-04-10T13: 35: 47.080+0200 INFO sched sched/schedule.go: 175 Job Next Run Canceled {"id": "every1Sec", "At": "2021-04-10T13:35:48+02:00"}
|
||||
2021/04/10 13: 35: 47 Doing some work for 5 seconds...
|
||||
2021/04/10 13: 35: 48 Finished Work.
|
||||
2021-04-10T13: 35: 48.082+0200 INFO sched sched/schedule.go: 212 Job Finished {"id": "every1Sec", "Instance": "12e1c9f3-69a7-4a31-8082-7dd40416f00b", "Duration": "5.001s", "State": "FINISHED"}
|
||||
2021/04/10 13: 35: 49 Finished Work.
|
||||
2021-04-10T13: 35: 49.086+0200 INFO sched sched/schedule.go:212 Job Finished {"id": "every1Sec", "Instance": "46ccdc9c-1792-4fc6-8e7b-aa269ea8b5a0", "Duration": "5.004s", "State": "FINISHED"}
|
||||
2021/04/10 13: 35: 50 Finished Work.
|
||||
2021-04-10T13:35: 50.081+0200 INFO sched sched/schedule.go: 212 Job Finished {"id": "every1Sec", "Instance": "4c663f7a-40a8-47a1-8eaa-4ed52cc80a94", "Duration": "5.003s", "State": "FINISHED"
|
||||
}
|
||||
2021/04/10 13: 35: 51 Finished Work.
|
||||
2021-04-10T13: 35: 51.084+0200 INFO sched sched/schedule.go: 212 Job Finished {"id": "every1Sec", "Instance": "22a192be-2d42-4840-bbfe-05e28bee1716", "Duration": "5.005s", "State": "FINISHED"}
|
||||
2021/04/10 13: 35: 52 Finished Work.
|
||||
2021-04-10T13: 35:52.080+0200 INFO sched sched/schedule.go: 212 Job Finished {"id": "every1Sec", "Instance": "08cb1143-c0cc-436c-a7e6-097b0ef4cbf0", "Duration": "5s", "State": "FINISHED"
|
||||
}
|
||||
2021-04-10T13: 35: 52.080+0200 INFO sched sched/schedule.go: 137 Job Schedule Stopped {
|
||||
"id": "every1Sec"
|
||||
}
|
||||
|
||||
```
|
46
examples/schedule-overlapping/main.go
Normal file
46
examples/schedule-overlapping/main.go
Normal file
|
@ -0,0 +1,46 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
every1Sec, err := sched.NewFixed(1 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid interval: %s", err.Error()))
|
||||
}
|
||||
|
||||
job := func() {
|
||||
log.Println("Doing some work for 5 seconds...")
|
||||
time.Sleep(5 * time.Second)
|
||||
log.Println("Finished Work.")
|
||||
}
|
||||
|
||||
// Create Schedule
|
||||
schedule := sched.NewSchedule("every1Sec", every1Sec, job, sched.WithLogger(sched.DefaultLogger()))
|
||||
|
||||
// Start Schedule
|
||||
schedule.Start()
|
||||
|
||||
log.Println("Stopping schedule Automatically after 5 seconds")
|
||||
time.AfterFunc(5*time.Second, func() {
|
||||
schedule.Stop()
|
||||
})
|
||||
|
||||
// Listen to CTRL + C And indefintly wait shutdown.
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
_ = <-signalChan
|
||||
|
||||
// Stop before shutting down.
|
||||
schedule.Stop()
|
||||
|
||||
return
|
||||
}
|
29
examples/schedule-panic/README.md
Normal file
29
examples/schedule-panic/README.md
Normal file
|
@ -0,0 +1,29 @@
|
|||
# Output with a job that panics and is handled by schdeuler
|
||||
|
||||
## Output
|
||||
|
||||
```json
|
||||
2021-04-10T13:06: 48.005+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "every10s"}
|
||||
2021-04-10T13:06: 48.005+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every10s", "After": "10s", "At": "2021-04-10T13:06:58+02:00"
|
||||
}
|
||||
2021-04-10T13: 06: 58.007+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "every10s", "After": "10s", "At": "2021-04-10T13:07:08+02:00"}
|
||||
2021-04-10T13: 06:58.007+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every10s", "Instance": "0f972951-37d0-44cf-bf9d-fa4a3e2ce0c4"}
|
||||
2021/04/10 13: 06: 58 Doing some work...
|
||||
2021-04-10T13: 06: 59.010+0200 ERROR sched sched/schedule.go:203 Job Error {"id": "every10s", "Instance": "0f972951-37d0-44cf-bf9d-fa4a3e2ce0c4", "Duration": "1.002s", "State": "PANICKED", "error": "job panicked: Oops, I panicked, we all do, sorry."}
|
||||
github.com/sherifabdlnaby/sched.(*Schedule).runJobInstance
|
||||
/Users/sherifabdlnaby/code/projects/sched/schedule.go: 203
|
||||
2021-04-10T13:06: 59.010+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every10s", "Instance": "0f972951-37d0-44cf-bf9d-fa4a3e2ce0c4", "Duration": "1.002s", "State": "PANICKED"
|
||||
}
|
||||
2021-04-10T13: 07: 08.007+0200 INFO sched sched/schedule.go:168 Job Next Run Scheduled {"id": "every10s", "After": "10s", "At": "2021-04-10T13:07:18+02:00"}
|
||||
2021-04-10T13:07: 08.007+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "every10s", "Instance": "122536fa-074a-42c8-912c-7eb1dd21e0da"}
|
||||
2021/04/10 13: 07: 08 Doing some work...
|
||||
2021-04-10T13: 07: 09.009+0200 ERROR sched sched/schedule.go: 203 Job Error {"id": "every10s", "Instance": "122536fa-074a-42c8-912c-7eb1dd21e0da", "Duration": "1.002s", "State": "PANICKED", "error": "job panicked: Oops, I panicked, we all do, sorry."}
|
||||
github.com/sherifabdlnaby/sched.(*Schedule).runJobInstance
|
||||
/Users/sherifabdlnaby/code/projects/sched/schedule.go: 203
|
||||
2021-04-10T13: 07: 09.009+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "every10s", "Instance": "122536fa-074a-42c8-912c-7eb1dd21e0da", "Duration": "1.002s", "State": "PANICKED"
|
||||
}
|
||||
...
|
||||
...
|
||||
...
|
||||
|
||||
```
|
44
examples/schedule-panic/main.go
Normal file
44
examples/schedule-panic/main.go
Normal file
|
@ -0,0 +1,44 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
fixedTimer10second, err := sched.NewFixed(10 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid interval: %s", err.Error()))
|
||||
}
|
||||
|
||||
job := func() {
|
||||
log.Println("Doing some work...")
|
||||
time.Sleep(1 * time.Second)
|
||||
|
||||
panic("Oops, I panicked, we all do, sorry.")
|
||||
|
||||
log.Println("Finished Work. (Shouldn't be printed)")
|
||||
}
|
||||
|
||||
// Create Schedule
|
||||
schedule := sched.NewSchedule("every10s", fixedTimer10second, job, sched.WithLogger(sched.DefaultLogger()))
|
||||
|
||||
// Start Schedule
|
||||
schedule.Start()
|
||||
|
||||
// Listen to CTRL + C And indefintly wait shutdown.
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
_ = <-signalChan
|
||||
|
||||
// Stop before shutting down.
|
||||
schedule.Stop()
|
||||
|
||||
return
|
||||
}
|
61
examples/schedule-prom-metrics/README.md
Normal file
61
examples/schedule-prom-metrics/README.md
Normal file
|
@ -0,0 +1,61 @@
|
|||
- Output with a job that run every 5s on a fixed schedule and run for a random amount of time no more than 5 S
|
||||
- Metrics at localhost:8080/metrics
|
||||
|
||||
## Output
|
||||
|
||||
```json
|
||||
# HELP sched_run_actual_elapsed_time sched_run_actual_elapsed_time summary
|
||||
# TYPE sched_run_actual_elapsed_time summary
|
||||
sched_run_actual_elapsed_time{ID="every5s", quantile="0.5"
|
||||
} 0.205075002
|
||||
sched_run_actual_elapsed_time{
|
||||
ID="every5s", quantile="0.75"
|
||||
} 1.103087326
|
||||
sched_run_actual_elapsed_time{
|
||||
ID="every5s", quantile="0.95"
|
||||
} 2.204325295
|
||||
sched_run_actual_elapsed_time{
|
||||
ID="every5s",quantile="0.99"
|
||||
} 2.204325295
|
||||
sched_run_actual_elapsed_time{
|
||||
ID="every5s", quantile="0.999"
|
||||
} 2.204325295
|
||||
sched_run_actual_elapsed_time_sum{
|
||||
ID="every5s"
|
||||
} 3.713109351
|
||||
sched_run_actual_elapsed_time_count{
|
||||
ID="every5s"
|
||||
} 4
|
||||
# HELP sched_run_errors sched_run_errors counter
|
||||
# TYPE sched_run_errors counter
|
||||
sched_run_errors{ID="every5s"} 0
|
||||
# HELP sched_run_total_elapsed_time sched_run_total_elapsed_time summary
|
||||
# TYPE sched_run_total_elapsed_time summary
|
||||
sched_run_total_elapsed_time{
|
||||
ID="every5s", quantile="0.5"
|
||||
} 0.205178562
|
||||
sched_run_total_elapsed_time{ID="every5s", quantile="0.75"
|
||||
} 1.103123691
|
||||
sched_run_total_elapsed_time{
|
||||
ID="every5s", quantile="0.95"
|
||||
} 2.204367762
|
||||
sched_run_total_elapsed_time{
|
||||
ID="every5s", quantile="0.99"
|
||||
} 2.204367762
|
||||
sched_run_total_elapsed_time{
|
||||
ID="every5s",quantile="0.999"
|
||||
} 2.204367762
|
||||
sched_run_total_elapsed_time_sum{
|
||||
ID="every5s"
|
||||
} 3.7133283589999997
|
||||
sched_run_total_elapsed_time_count{ID="every5s"} 4
|
||||
# HELP sched_runs sched_runs counter
|
||||
# TYPE sched_runs counter
|
||||
sched_runs{ID="every5s"} 3
|
||||
# HELP sched_runs_overlapping sched_runs_overlapping counter
|
||||
# TYPE sched_runs_overlapping counter
|
||||
sched_runs_overlapping{ID="every5s"} 0
|
||||
# HELP sched_up sched_up gauge
|
||||
# TYPE sched_up gauge
|
||||
sched_up{ID="every5s"} 1
|
||||
```
|
59
examples/schedule-prom-metrics/main.go
Normal file
59
examples/schedule-prom-metrics/main.go
Normal file
|
@ -0,0 +1,59 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"github.com/uber-go/tally"
|
||||
"github.com/uber-go/tally/prometheus"
|
||||
"log"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
promReporter := prometheus.NewReporter(prometheus.Options{})
|
||||
promMterics, closer := tally.NewRootScope(tally.ScopeOptions{
|
||||
Tags: map[string]string{},
|
||||
CachedReporter: promReporter,
|
||||
Separator: prometheus.DefaultSeparator,
|
||||
}, 1*time.Second)
|
||||
defer closer.Close()
|
||||
|
||||
fixedEvery5s, err := sched.NewFixed(5 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid interval: %s", err.Error()))
|
||||
}
|
||||
|
||||
job := func() {
|
||||
log.Println("Doing some work for random time...")
|
||||
time.Sleep(time.Duration(int(rand.Int63n(50)+1)*100) * time.Millisecond)
|
||||
log.Println("Finished Work.")
|
||||
}
|
||||
|
||||
// Create Schedule
|
||||
schedule := sched.NewSchedule("every5s", fixedEvery5s, job, sched.WithLogger(sched.DefaultLogger()),
|
||||
sched.WithMetrics(promMterics))
|
||||
|
||||
// Start Schedule
|
||||
schedule.Start()
|
||||
|
||||
// Star Prom Server
|
||||
http.Handle("/metrics", promReporter.HTTPHandler())
|
||||
go http.ListenAndServe(":8080", nil)
|
||||
log.Println("Prometheus Metrics at :8080/metrics")
|
||||
|
||||
// Listen to CTRL + C And indefintly wait shutdown.
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
_ = <-signalChan
|
||||
|
||||
// Stop before shutting down.
|
||||
schedule.Stop()
|
||||
|
||||
return
|
||||
}
|
56
examples/scheduler/README.md
Normal file
56
examples/scheduler/README.md
Normal file
|
@ -0,0 +1,56 @@
|
|||
# 4 Schedules in a Scheduler Manager
|
||||
|
||||
1. Cron Every Minute
|
||||
2. Cron Every 5 Minutes
|
||||
3. Fixed Interval Every 30 Secs
|
||||
4. *Once* after 10 Secs from schedule start.
|
||||
|
||||
Started and Stopped using `StartAll()` and `StopAll()`
|
||||
|
||||
## Output
|
||||
|
||||
```json
|
||||
2021-04-10T13:26: 43.142+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "cronEveryMinute"}
|
||||
2021-04-10T13:26: 43.142+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "cronEvery5Minute"}
|
||||
2021-04-10T13:26: 43.142+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "fixedTimer30second"}
|
||||
2021-04-10T13:26: 43.142+0200 INFO sched sched/schedule.go: 96 Job Schedule Started {"id": "onceAfter10s"}
|
||||
2021-04-10T13:26: 43.142+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cronEveryMinute", "After": "17s", "At": "2021-04-10T13:27:00+02:00"
|
||||
}
|
||||
2021-04-10T13: 26: 43.143+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "onceAfter10s", "After": "10s", "At": "2021-04-10T13:26:53+02:00"}
|
||||
2021-04-10T13: 26:43.142+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "cronEvery5Minute", "After": "3m17s", "At": "2021-04-10T13:30:00+02:00"
|
||||
}
|
||||
2021-04-10T13: 26: 43.143+0200 INFO sched sched/schedule.go: 168 Job Next Run Scheduled {"id": "fixedTimer30second", "After": "30s", "At": "2021-04-10T13:27:13+02:00"}
|
||||
2021-04-10T13: 26: 53.143+0200 INFO sched sched/schedule.go: 162 No more Jobs will be scheduled {"id": "onceAfter10s"}
|
||||
2021-04-10T13: 26: 53.143+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "onceAfter10s"}
|
||||
2021-04-10T13: 26:53.143+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "onceAfter10s"}
|
||||
2021-04-10T13:26: 53.143+0200 INFO sched sched/schedule.go: 193 Job Run Starting {"id": "onceAfter10s", "Instance": "47fe7d35-3494-43e0-8771-4282ecb80f3a"}
|
||||
2021/04/10 13: 26: 53 onceAfter10s Doing some work...
|
||||
2021/04/10 13: 26: 54 onceAfter10s Finished Work.
|
||||
2021-04-10T13: 26: 54.148+0200 INFO sched sched/schedule.go: 208 Job Finished {"id": "onceAfter10s", "Instance": "47fe7d35-3494-43e0-8771-4282ecb80f3a", "Duration": "1.005s", "State": "FINISHED"}
|
||||
2021-04-10T13: 26: 54.148+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_actual_elapsed_time {"id": "onceAfter10s", "name": "sched.run_actual_elapsed_time", "interval": "1.004917899s", "tags": {
|
||||
"ID": "onceAfter10s"
|
||||
}
|
||||
}
|
||||
2021-04-10T13: 26: 54.148+0200 INFO sched.metrics sched/metric.go: 48 timer sched.run_total_elapsed_time {"id": "onceAfter10s", "name": "sched.run_total_elapsed_time", "interval": "1.004966378s", "tags": {"ID": "onceAfter10s"}
|
||||
}
|
||||
2021-04-10T13: 26: 54.148+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {"id": "onceAfter10s"}
|
||||
2021-04-10T13: 26: 54.148+0200 INFO sched sched/schedule.go: 153 Job Schedule Finished {"id": "onceAfter10s"}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "cronEveryMinute"}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "fixedTimer30second"}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "cronEveryMinute"}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 125 Stopping Schedule... {"id": "cronEvery5Minute"}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {"id": "cronEveryMinute"}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "cronEvery5Minute"
|
||||
}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 171 Job Next Run Canceled {"id": "fixedTimer30second", "At": "2021-04-10T13:27:13+02:00"
|
||||
}
|
||||
2021-04-10T13:26: 57.662+0200 INFO sched sched/schedule.go: 171 Job Next Run Canceled {"id": "cronEvery5Minute", "At": "2021-04-10T13:30:00+02:00"
|
||||
}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {"id": "cronEvery5Minute"
|
||||
}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 130 Waiting active jobs to finish... {"id": "fixedTimer30second"}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 133 Job Schedule Stopped {"id": "fixedTimer30second"}
|
||||
2021-04-10T13: 26: 57.662+0200 INFO sched sched/schedule.go: 171 Job Next Run Canceled {"id": "cronEveryMinute", "At": "2021-04-10T13:27:00+02:00"}
|
||||
|
||||
```
|
||||
|
63
examples/scheduler/main.go
Normal file
63
examples/scheduler/main.go
Normal file
|
@ -0,0 +1,63 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/sherifabdlnaby/sched"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
job := func(id string) func() {
|
||||
return func() {
|
||||
log.Println(id + "\t Doing some work...")
|
||||
time.Sleep(1 * time.Second)
|
||||
log.Println(id + "\t Finished Work.")
|
||||
}
|
||||
}
|
||||
|
||||
cronTimer, err := sched.NewCron("* * * * *")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid cron expression: %s", err.Error()))
|
||||
}
|
||||
|
||||
cronTimer5, err := sched.NewCron("*/5 * * * *")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid cron expression: %s", err.Error()))
|
||||
}
|
||||
|
||||
fixedTimer30second, err := sched.NewFixed(30 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid interval: %s", err.Error()))
|
||||
}
|
||||
|
||||
onceAfter10s, err := sched.NewOnce(10 * time.Second)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("invalid delay: %s", err.Error()))
|
||||
}
|
||||
|
||||
// Create Schedule
|
||||
scheduler := sched.NewScheduler(sched.WithLogger(sched.DefaultLogger()),
|
||||
sched.WithConsoleMetrics(1*time.Minute))
|
||||
|
||||
_ = scheduler.Add("cronEveryMinute", cronTimer, job("every-minute-cron"))
|
||||
_ = scheduler.Add("cronEvery5Minute", cronTimer5, job("every-five-minute-cron"))
|
||||
_ = scheduler.Add("fixedTimer30second", fixedTimer30second, job("fixedEvery30Second"))
|
||||
_ = scheduler.Add("onceAfter10s", onceAfter10s, job("onceAfter10s"))
|
||||
|
||||
scheduler.StartAll()
|
||||
|
||||
// Listen to CTRL + C
|
||||
signalChan := make(chan os.Signal, 1)
|
||||
signal.Notify(signalChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
||||
_ = <-signalChan
|
||||
|
||||
// Stop before shutting down.
|
||||
scheduler.StopAll()
|
||||
|
||||
return
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
package sched
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
|
@ -126,8 +127,11 @@ func (s *Schedule) Stop() {
|
|||
s.stopScheduleSignal <- struct{}{}
|
||||
close(s.stopScheduleSignal)
|
||||
|
||||
// Wait for all instances
|
||||
s.logger.Infow("Waiting active jobs to finish...")
|
||||
// Print No. of Active Jobs
|
||||
if noOfActiveJobs := s.activeJobs.len(); s.activeJobs.len() > 0 {
|
||||
s.logger.Infow(fmt.Sprintf("Waiting for '%d' active jobs still running...", noOfActiveJobs))
|
||||
}
|
||||
|
||||
s.wg.Wait()
|
||||
s.state = STOPPED
|
||||
s.logger.Infow("Job Schedule Stopped")
|
||||
|
|
|
@ -26,7 +26,7 @@ func (s *Scheduler) Add(id string, timer Timer, job func()) error {
|
|||
s.mx.Lock()
|
||||
defer s.mx.Unlock()
|
||||
|
||||
if _, ok := s.schedules[id]; !ok {
|
||||
if _, ok := s.schedules[id]; ok {
|
||||
return fmt.Errorf("job with this ID already exists")
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue