Skip to content

Commit f990ff4

Browse files
authored
Merge pull request #204 from kdroidFilter/feat/scheduler-typed-api
refactor(scheduler)!: typed TaskId, LocalTime, @serializable inputData
2 parents 3343b51 + b1914d9 commit f990ff4

30 files changed

Lines changed: 1016 additions & 622 deletions

File tree

docs/runtime/scheduler.md

Lines changed: 280 additions & 108 deletions
Large diffs are not rendered by default.

scheduler-demo/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ plugins {
66
kotlin("jvm")
77
alias(libs.plugins.kotlinComposePlugin)
88
alias(libs.plugins.jetbrainsCompose)
9+
alias(libs.plugins.kotlinxSerialization)
910
id("io.github.kdroidfilter.nucleus")
1011
}
1112

scheduler-demo/src/main/kotlin/schedulerdemo/Main.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@ import org.jetbrains.jewel.intui.standalone.theme.default
1717
import org.jetbrains.jewel.intui.standalone.theme.lightThemeDefinition
1818
import org.jetbrains.jewel.ui.ComponentStyling
1919
import schedulerdemo.task.BackupTask
20+
import schedulerdemo.task.BackupTaskId
2021
import schedulerdemo.task.NotificationTask
22+
import schedulerdemo.task.NotificationTaskId
2123
import schedulerdemo.task.SyncTask
24+
import schedulerdemo.task.SyncTaskId
2225

2326
private fun buildRegistry() =
2427
TaskRegistry
2528
.Builder()
26-
.register("sync") { SyncTask() }
27-
.register("backup") { BackupTask() }
28-
.register("notification") { NotificationTask() }
29+
.register(SyncTaskId) { SyncTask() }
30+
.register(BackupTaskId) { BackupTask() }
31+
.register(NotificationTaskId) { NotificationTask() }
2932
.build()
3033

3134
fun main(args: Array<String>) {

scheduler-demo/src/main/kotlin/schedulerdemo/SchedulerDemoView.kt

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,14 @@ import org.jetbrains.jewel.ui.component.DefaultButton
3131
import org.jetbrains.jewel.ui.component.GroupHeader
3232
import org.jetbrains.jewel.ui.component.OutlinedButton
3333
import org.jetbrains.jewel.ui.component.Text
34+
import schedulerdemo.task.BackupInput
35+
import schedulerdemo.task.BackupTaskId
36+
import schedulerdemo.task.NotificationInput
37+
import schedulerdemo.task.NotificationTaskId
38+
import schedulerdemo.task.ReportTaskId
39+
import schedulerdemo.task.SyncTaskId
3440
import java.time.Instant
41+
import java.time.LocalTime
3542
import java.time.ZoneId
3643
import java.time.format.DateTimeFormatter
3744
import kotlin.time.Duration.Companion.hours
@@ -87,7 +94,7 @@ fun SchedulerDemoView(openedByScheduler: Boolean = false) {
8794

8895
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
8996
DefaultButton(onClick = {
90-
val ok = scheduler.enqueue(TaskRequest.periodic("sync", 1.hours))
97+
val ok = scheduler.enqueue(TaskRequest.periodic(SyncTaskId, 1.hours))
9198
log(if (ok) "Enqueued 'sync' (every 1h)" else "Failed to enqueue 'sync'")
9299
refreshTasks()
93100
}) {
@@ -97,8 +104,8 @@ fun SchedulerDemoView(openedByScheduler: Boolean = false) {
97104
DefaultButton(onClick = {
98105
val ok =
99106
scheduler.enqueue(
100-
TaskRequest.periodic("backup", 30.minutes) {
101-
inputData("target", "/tmp/backup")
107+
TaskRequest.periodic(BackupTaskId, 30.minutes) {
108+
inputData(BackupInput(target = "/tmp/backup"))
102109
},
103110
)
104111
log(if (ok) "Enqueued 'backup' (every 30min)" else "Failed to enqueue 'backup'")
@@ -108,7 +115,10 @@ fun SchedulerDemoView(openedByScheduler: Boolean = false) {
108115
}
109116

110117
DefaultButton(onClick = {
111-
val ok = scheduler.enqueue(TaskRequest.calendar("report", CronExpression.everyDayAt(9)))
118+
val ok =
119+
scheduler.enqueue(
120+
TaskRequest.calendar(ReportTaskId, CronExpression.everyDayAt(LocalTime.of(9, 0))),
121+
)
112122
log(if (ok) "Enqueued 'report' (daily at 9h)" else "Failed to enqueue 'report'")
113123
refreshTasks()
114124
}) {
@@ -118,9 +128,13 @@ fun SchedulerDemoView(openedByScheduler: Boolean = false) {
118128
DefaultButton(onClick = {
119129
val ok =
120130
scheduler.enqueue(
121-
TaskRequest.periodic("notification", 15.minutes) {
122-
inputData("title", "Scheduled Notification")
123-
inputData("message", "This notification was scheduled 15 minutes ago!")
131+
TaskRequest.periodic(NotificationTaskId, 15.minutes) {
132+
inputData(
133+
NotificationInput(
134+
title = "Scheduled Notification",
135+
message = "This notification was scheduled 15 minutes ago!",
136+
),
137+
)
124138
},
125139
)
126140
log(if (ok) "Enqueued 'notification' (every 15min)" else "Failed to enqueue 'notification'")

scheduler-demo/src/main/kotlin/schedulerdemo/task/SampleTasks.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,30 @@ package schedulerdemo.task
22

33
import io.github.kdroidfilter.nucleus.scheduler.DesktopTask
44
import io.github.kdroidfilter.nucleus.scheduler.TaskContext
5+
import io.github.kdroidfilter.nucleus.scheduler.TaskId
56
import io.github.kdroidfilter.nucleus.scheduler.TaskResult
7+
import io.github.kdroidfilter.nucleus.scheduler.inputData
8+
import kotlinx.serialization.Serializable
69
import java.time.LocalDateTime
710
import java.time.format.DateTimeFormatter
811
import java.util.logging.Logger
912

13+
val SyncTaskId: TaskId = TaskId("sync")
14+
val BackupTaskId: TaskId = TaskId("backup")
15+
val NotificationTaskId: TaskId = TaskId("notification")
16+
val ReportTaskId: TaskId = TaskId("report")
17+
18+
@Serializable
19+
data class BackupInput(
20+
val target: String,
21+
)
22+
23+
@Serializable
24+
data class NotificationInput(
25+
val title: String,
26+
val message: String,
27+
)
28+
1029
class SyncTask : DesktopTask {
1130
private val logger = Logger.getLogger(SyncTask::class.java.name)
1231

@@ -21,7 +40,7 @@ class BackupTask : DesktopTask {
2140
private val logger = Logger.getLogger(BackupTask::class.java.name)
2241

2342
override suspend fun doWork(context: TaskContext): TaskResult {
24-
val target = context.inputData["target"] ?: "default"
43+
val target = context.inputData<BackupInput>()?.target ?: "default"
2544
val timestamp = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
2645
logger.info("BackupTask to '$target' executed at $timestamp")
2746
return TaskResult.Success

scheduler-testing/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
22

33
plugins {
44
kotlin("jvm")
5+
alias(libs.plugins.kotlinxSerialization)
56
alias(libs.plugins.vanniktechMavenPublish)
67
}
78

0 commit comments

Comments
 (0)