ChatGPT

很好,这一步我们不再是“功能完整”,而是要达到:

极简、优雅、直觉化、Kotlin 风格,同时保持生产级能力

设计目标参考 Ktor、Spring Framework、Quartz Scheduler,但 API 更现代。

一、核心设计原则(最重要)

API 必须满足:

1. 最少概念
2. 最少样板代码
3. 强类型
4. Kotlin DSL 风格
5. 默认行为合理
6. 手动执行和调度完全统一
7. context 注入自然

避免这种冗余设计:

tm.addTask("name") {
    trigger(...)
    context(...)
    task(...)
}

可以更简洁。

二、最终推荐 API(极简优雅版)

核心入口:

val tasks = TaskManager()

三、定义任务(核心 API)

最简 fixed rate

tasks.task("heartbeat", every = 5.seconds) {
    println("heartbeat")
}

cron

tasks.task("cleanup", cron = "0 * * * *") {
    println("cleanup")
}

无 trigger(纯手动任务)

tasks.task("rebuild-index") {
    println("rebuild")
}

这是极其重要的简化:

trigger 是可选的

四、context 注入(优雅方式)

全局 context

val tasks = TaskManager {

    context["db"] = db
    context["config"] = config
}

使用 context

tasks.task("cleanup", cron = "0 * * * *") { ctx ->

    val db = ctx["db"] as Database

    db.cleanup()
}

五、手动执行(统一 API)

最简单:

tasks.run("cleanup")

带 context:

tasks.run("cleanup") {
    it["table"] = "users"
}

获取结果:

val future = tasks.run("compute")

阻塞:

val result = tasks.runBlocking("compute")

六、完整 API 一览(最终版)

class TaskManager(
    config: TaskManagerConfig.() -> Unit = {}
)

注册任务(核心 API,仅一个方法)

fun task(
    name: String,
    cron: String? = null,
    every: Duration? = null,
    delay: Duration? = null,
    concurrent: Boolean = false,
    block: TaskContext.() -> Any?
)

这是核心设计。

用户只需要记住:

tasks.task(...)

七、执行任务 API

fun run(name: String): Future<Any?>
fun run(
    name: String,
    context: (MutableMap<String, Any>) -> Unit
): Future<Any?>
fun runBlocking(name: String): Any?
fun runBlocking(
    name: String,
    context: (MutableMap<String, Any>) -> Unit
): Any?

八、context API(极简)

TaskContext:

interface TaskContext {

    operator fun get(key: String): Any?

    operator fun set(key: String, value: Any)

}

使用:

tasks.task("example") {

    val db = this["db"] as Database

}

九、完整使用示例(最终体验)

val tasks = TaskManager {

    context["db"] = db
}

tasks.task("heartbeat", every = 5.seconds) {

    println("heartbeat")
}

tasks.task("cleanup", cron = "0 * * * *") {

    val db = this["db"] as Database

    db.cleanup()
}

tasks.task("compute") {

    1 + 2
}

tasks.run("cleanup")

val result = tasks.runBlocking("compute")

十、完整配置 API

val tasks = TaskManager {

    threads = 4

    threadName = "tasks"

    context["db"] = db
}

TaskManagerConfig:

class TaskManagerConfig {

    var threads: Int = Runtime.getRuntime().availableProcessors()

    var threadName: String = "task-manager"

    val context: MutableMap<String, Any> = ConcurrentHashMap()
}

十一、内部结构(保持简单)

TaskManager
 ├── executor
 ├── schedulerThread
 ├── tasks map
 ├── priority queue
 ├── global context

十二、为什么这个 API 是最优解

因为用户只需要理解 3 个概念:

tasks.task(...)
tasks.run(...)
context

而不是:

Trigger
TaskDefinition
Builder
Scheduler

全部隐藏。

十三、对比传统 API(优势明显)

Quartz:

JobDetail job = JobBuilder.newJob(...)
Trigger trigger = TriggerBuilder.newTrigger(...)
scheduler.scheduleJob(job, trigger)

你的 API:

tasks.task("cleanup", cron="0 * * * *") { }

复杂度降低:

10x simpler

十四、推荐额外 API(可选)

取消任务:

tasks.cancel("cleanup")

检查:

tasks.exists("cleanup")

关闭:

tasks.shutdown()

十五、完整 API 总表(最终推荐)

class TaskManager(config: TaskManagerConfig.() -> Unit = {})

fun task(
    name: String,
    cron: String? = null,
    every: Duration? = null,
    delay: Duration? = null,
    concurrent: Boolean = false,
    block: TaskContext.() -> Any?
)

fun run(name: String): Future<Any?>

fun run(
    name: String,
    context: (MutableMap<String, Any>) -> Unit
): Future<Any?>

fun runBlocking(name: String): Any?

fun runBlocking(
    name: String,
    context: (MutableMap<String, Any>) -> Unit
): Any?

fun cancel(name: String)

fun shutdown()

十六、最终效果总结

优点:

极简 API
完整功能
context 支持
cron 支持
手动执行支持
Future 支持
线程池执行
无需协程
生产级

十七、最终推荐风格(强烈推荐)

这就是最佳 API:

val tasks = TaskManager()

tasks.task("cleanup", cron="0 * * * *") {

    println("cleanup")
}

tasks.run("cleanup")

如果你愿意,我可以进一步设计:

一个 完整实现架构(约 250 行)+ 完整类结构图,保证:

零锁竞争
高性能
无 bug 调度