fix(action): fix unexpected scheduled action losing

This commit is contained in:
2026-04-21 17:12:44 +08:00
parent de340029c6
commit 3d56966381

View File

@@ -201,8 +201,13 @@ class ActionScheduler : AbstractAgentModule.Standalone() {
val shouldBreak: Boolean val shouldBreak: Boolean
) )
fun collectToTrigger(tick: Int, previousTick: Int, triggerHour: Int): Set<Schedulable>? { fun collectToTrigger(
if (tick > previousTick) { tick: Int,
previousTick: Int,
triggerHour: Int,
includeRemainingHour: Boolean = false
): Set<Schedulable>? {
if (tick >= previousTick) {
val toTrigger = mutableSetOf<Schedulable>() val toTrigger = mutableSetOf<Schedulable>()
for (i in previousTick..tick) { for (i in previousTick..tick) {
val bucket = wheel[i] val bucket = wheel[i]
@@ -213,6 +218,13 @@ class ActionScheduler : AbstractAgentModule.Standalone() {
bucket.clear() // 避免重复触发 bucket.clear() // 避免重复触发
} }
} }
if (includeRemainingHour) {
val remainingHourBucket = schedulableGroupByHour[triggerHour]
if (remainingHourBucket.isNotEmpty()) {
toTrigger.addAll(remainingHourBucket.filter { it.enabled })
remainingHourBucket.clear()
}
}
return toTrigger return toTrigger
} }
return null return null
@@ -261,7 +273,12 @@ class ActionScheduler : AbstractAgentModule.Standalone() {
checkThenExecute(false) { checkThenExecute(false) {
if (it.hour != launchingHour) { if (it.hour != launchingHour) {
shouldBreak = true shouldBreak = true
toTrigger = collectToTrigger(wheel.lastIndex, previousTick, launchingHour) toTrigger = collectToTrigger(
wheel.lastIndex,
previousTick,
launchingHour,
includeRemainingHour = true
)
log.debug( log.debug(
"Hour changed, previousTick: {}, tick: {}, toTriggerSize: {}", "Hour changed, previousTick: {}, tick: {}, toTriggerSize: {}",
previousTick, previousTick,
@@ -270,7 +287,12 @@ class ActionScheduler : AbstractAgentModule.Standalone() {
) )
return@checkThenExecute return@checkThenExecute
} }
toTrigger = collectToTrigger(tick, previousTick, launchingHour) toTrigger = collectToTrigger(
tick,
previousTick,
launchingHour,
includeRemainingHour = tick >= wheel.lastIndex
)
if (tick >= wheel.lastIndex || schedulableGroupByHour[launchingHour].isEmpty()) { if (tick >= wheel.lastIndex || schedulableGroupByHour[launchingHour].isEmpty()) {
state.value = WheelState.SLEEPING state.value = WheelState.SLEEPING
shouldBreak = true shouldBreak = true