Skip to content

Kronos

A persistent, distributed job scheduler for Kotlin JVM — without the complexity of cron expressions.

Jobs run with minute-level precision, survive service restarts, and coordinate safely across multiple instances via a conditional atomic lock.

At a glance

import kronos.mongo.init

Kronos.init(
    mongoConnectionString = "mongodb://localhost:27017",
    redisConnectionString = "redis://localhost:6379"
)

Kronos.register(SendReport)

Kronos.schedule(jobName = SendReport.name, params = mapOf("id" to "123"))

Kronos.schedulePeriodic(
    jobName = SendReport.name,
    periodic = Periodic.everyDay(hour = 9, minute = 0),
    params = mapOf("id" to "123")
)
import kronos.exposed.init

Kronos.init(
    dataSource = ds,
    cache = RedisCacheClient("redis://localhost:6379")
)
import kronos.exposed.init
import com.funyinkash.kachecontroller.cache.InMemoryCacheClient
import org.sqlite.SQLiteDataSource

val ds = SQLiteDataSource().apply {
    url = "jdbc:sqlite:kronos.db"
}

Kronos.init(
    dataSource = ds,
    cache = InMemoryCacheClient()
)
import kronos.exposed.init
import com.funyinkash.kachecontroller.cache.InMemoryCacheClient

val ds = HikariDataSource().apply { /* ... */ }

Kronos.init(
    dataSource = ds,
    cache = InMemoryCacheClient()
)

See Quick Start to get running in minutes.