Scheduling Tasks With Cron in Golang
This golang tutorial help to create schedule a jon to execute at specific time interval.This is very helpful feature to run a process or tasks as background
This golang tutorial help to create schedule a jon to execute at specific time interval.
This is very helpful feature to run a process or tasks as background, that can be a job that pull data from third party server, sync data between two server, send an email notification at a specific inerval.
To get the package, execute:
go get gopkg.in/robfig/cron.v
To import this package, add the following line to your code:
import "gopkg.in/robfig/cron.v2"
I will use golang cron v3 package to schedule job in golang application.This package cron implements a cron spec parser and job runner.You can schedule job/tasks at the given time interval. Callers may register Funcs to be invoked on a given schedule. Cron will run them in their own goroutines.
A cron expression represents a set of times, using 5 space-separated fields.
The asterisk indicates that the cron expression will match for all values of the field; e.g., using an asterisk in the 5th field (month) would indicate every month.
Slashes are used to describe increments of ranges. For example 3-59/15 in the 1st field (minutes) would indicate the 3rd minute of the hour and every 15 minutes thereafter. The form "*\/..." is equivalent to the form "first-last/...", that is, an increment over the largest possible range of the field. The form "N/..." is accepted as meaning "N-MAX/...", that is, starting at N, use the increment until the end of that specific range. It does not wrap around.
Commas are used to separate items of a list. For example, using "MON,WED,FRI" in the 5th field (day of week) would mean Mondays, Wednesdays and Fridays.
Hyphens are used to define ranges. For example, 9-17 would indicate every hour between 9am and 5pm inclusive.
Question mark may be used instead of '*' for leaving either day-of-month or day-of-week blank.
Field name | Mandatory? | Allowed values | Allowed special characters
---------- | ---------- | -------------- | --------------------------
Minutes | Yes | 0-59 | * / , -
Hours | Yes | 0-23 | * / , -
Day of month | Yes | 1-31 | * / , - ?
Month | Yes | 1-12 or JAN-DEC | * / , -
Day of week | Yes | 0-6 or SUN-SAT | * / , - ?
Month and Day-of-week field values are case insensitive. "SUN", "Sun", and "sun" are equally accepted.
You may use one of several pre-defined schedules in place of a cron expression.
Entry | Description | Equivalent To
----- | ----------- | -------------
@yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 1 1 *
@monthly | Run once a month, midnight, first of month | 0 0 1 * *
@weekly | Run once a week, midnight between Sat/Sun | 0 0 * * 0
@daily (or @midnight) | Run once a day, midnight | 0 0 * * *
@hourly | Run once an hour, beginning of hour | 0 * * * *
You may also schedule a job to execute at fixed intervals, starting at the time it's added or cron is run. This is supported by formatting the cron spec like this:
For example, "@every 1h30m10s" would indicate a schedule that activates after 1 hour, 30 minutes, 10 seconds, and then every interval after that.
package main
import (
"fmt"
"time"
"gopkg.in/robfig/cron.v2"
)
func main() {
c := cron.New()
c.AddFunc("@every 0h0m1s", func() { fmt.Println("Every second") })
c.Start()
// Added time to see output
time.Sleep(10 * time.Second)
c.Stop() // Stop the scheduler (does not stop any jobs already running).
}
Note: The interval does not take the job runtime into account. For example, if a job takes 3 minutes to run, and it is scheduled to run every 5 minutes, it will have only 2 minutes of idle time between each run.