CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/golang-github-com-go-co-op-gocron-v2

A Golang job scheduling library that lets you run Go functions at pre-determined intervals using cron expressions, fixed durations, daily, weekly, monthly, or one-time schedules with support for distributed deployments.

Overview
Eval results
Files

scheduler.mddocs/examples/api/

Examples: Scheduler API

Practical examples of scheduler operations.

Basic Scheduler

package main

import (
    "fmt"
    "time"
    "github.com/go-co-op/gocron/v2"
)

func main() {
    // Create scheduler
    s, err := gocron.NewScheduler()
    if err != nil {
        panic(err)
    }
    defer s.Shutdown()

    // Add job
    j, err := s.NewJob(
        gocron.DurationJob(time.Minute),
        gocron.NewTask(func() {
            fmt.Println("Task running")
        }),
    )
    if err != nil {
        panic(err)
    }

    fmt.Printf("Job scheduled: %s\n", j.ID())

    // Start scheduling
    s.Start()

    // Block
    select {}
}

Job Management

func main() {
    s, _ := gocron.NewScheduler()
    defer s.Shutdown()

    // Create multiple jobs
    j1, _ := s.NewJob(
        gocron.DurationJob(time.Minute),
        gocron.NewTask(task1),
        gocron.WithName("task1"),
        gocron.WithTags("worker"),
    )

    j2, _ := s.NewJob(
        gocron.DurationJob(time.Minute),
        gocron.NewTask(task2),
        gocron.WithName("task2"),
        gocron.WithTags("worker"),
    )

    s.Start()

    // List all jobs
    jobs := s.Jobs()
    fmt.Printf("Total jobs: %d\n", len(jobs))
    for _, j := range jobs {
        fmt.Printf("  - %s (ID: %s)\n", j.Name(), j.ID())
    }

    // Remove job by ID
    time.Sleep(5 * time.Second)
    if err := s.RemoveJob(j1.ID()); err != nil {
        fmt.Printf("Error removing job: %v\n", err)
    }

    // Remove jobs by tag
    if err := s.RemoveByTags("worker"); err != nil {
        fmt.Printf("Error removing by tags: %v\n", err)
    }

    select {}
}

func task1() {
    fmt.Println("Task 1")
}

func task2() {
    fmt.Println("Task 2")
}

Update Jobs

func main() {
    s, _ := gocron.NewScheduler()
    defer s.Shutdown()

    // Create job
    j, _ := s.NewJob(
        gocron.DurationJob(time.Minute),
        gocron.NewTask(func() {
            fmt.Println("Original interval")
        }),
        gocron.WithName("updatable-job"),
    )

    s.Start()

    fmt.Printf("Initial interval: 1 minute\n")
    time.Sleep(5 * time.Second)

    // Update job with new interval
    newJob, err := s.Update(
        j.ID(),
        gocron.DurationJob(5*time.Minute), // New interval
        gocron.NewTask(func() {
            fmt.Println("Updated interval")
        }),
        gocron.WithName("updatable-job"),
    )
    if err != nil {
        fmt.Printf("Error updating: %v\n", err)
    } else {
        fmt.Printf("Updated interval: 5 minutes\n")
    }

    select {}
}

Graceful Shutdown

import (
    "context"
    "os"
    "os/signal"
    "syscall"
)

func main() {
    s, _ := gocron.NewScheduler(
        gocron.WithStopTimeout(30*time.Second),
    )

    // Add jobs...
    s.NewJob(
        gocron.DurationJob(time.Minute),
        gocron.NewTask(func() {
            fmt.Println("Working...")
            time.Sleep(5 * time.Second)
        }),
    )

    s.Start()

    // Wait for interrupt signal
    ctx, cancel := signal.NotifyContext(
        context.Background(),
        os.Interrupt,
        syscall.SIGTERM,
    )
    defer cancel()

    <-ctx.Done()
    fmt.Println("Shutting down...")

    if err := s.Shutdown(); err != nil {
        fmt.Printf("Shutdown error: %v\n", err)
    }

    fmt.Println("Shutdown complete")
}

See Also

  • Scheduler API Guide
  • Lifecycle Examples

Install with Tessl CLI

npx tessl i tessl/golang-github-com-go-co-op-gocron-v2

docs

index.md

tile.json