Skip to content

A Redis based task scheduling module written in Golang.

License

Notifications You must be signed in to change notification settings

nekomeowww/timecapsule

Folders and files

NameName
Last commit message
Last commit date
Mar 2, 2025
Oct 11, 2022
Aug 16, 2023
Oct 11, 2022
Jan 5, 2023
May 23, 2023
May 23, 2023
Dec 10, 2023
Sep 29, 2024
Dec 23, 2024
Dec 23, 2024
Dec 23, 2024
Mar 2, 2025
Mar 2, 2025
Jun 16, 2023
May 16, 2023
May 16, 2023

Repository files navigation

TimeCapsule

Go Report Unit Tests

TimeCapsule is a Redis based task scheduling module written in Golang. It is designed to be used as a library in your own application. It is not a standalone application.

As the name suggests, it is inspired by the concept of time capsule which is designed to be used in a similar way. You can schedule tasks to be executed at a specific time in the future just like you buried a time capsule, and use this module to periodically look for tasks that are due to be executed from the dataloader. Once a task is due, it will be executed and removed from the dataloader.

Features:

  • Golang 1.18 Generic support
  • Customizable dataloader for performing task scheduling and execution

Installation

go get github.com/nekomeowww/timecapsule

Usage

package main

import (
    "fmt"
    "time"

    "github.com/nekomeowww/timecapsule"
)

func main() {
    // initialize redis dataloader
    redisDataloder := NewRedisDataloader[string]("some/task/key", redis.NewClient(&redis.Options{
        Addr: net.JoinHostPort("localhost", "6379"),
        Password: "123456",
    }))

    // create a time capsule digger, pass 250*time.Millisecond into parameter as the interval
    digger := NewDigger[string](redisDataloder, 250*time.Millisecond)

    // set task handler function
    digger.SetHandler(func(capsule *TimeCapsule[string]) {
        fmt.Println("task", capsule.Payload, "is due") // print a message
    })

    // start digging in a seperated goroutine
    go digger.Start()
    // defer stop digging
    defer digger.Stop()

    // Bury a time capsule
    err = digger.BuryFor("this is a time capsule", time.Second)
    if err != nil {
        logger.Error(err)
    }

    err = digger.BuryUntil("this is a time capsule", time.Now().UTC().Add(time.Second).UnixMilli())
    if err != nil {
        logger.Error(err)
    }
}