feat: add random delay

This commit is contained in:
engigu
2026-03-02 18:29:07 +08:00
parent 42ac0f4acb
commit d8f1b8b50c
13 changed files with 114 additions and 37 deletions
+30 -15
View File
@@ -1,7 +1,9 @@
package executor
import (
"math/rand"
"sync"
"time"
"github.com/engigu/baihu-panel/internal/systime"
@@ -87,27 +89,40 @@ func (m *CronManager) AddTask(task CronTask) error {
m.logger.Errorf("[CronManager] 任务 #%s 执行过程中发生 Panic: %v", taskID, r)
}
}()
m.logger.Infof("[CronManager] 触发计划任务 #%s (%s)", taskID, name)
req := &ExecutionRequest{
TaskID: taskID,
Name: name,
Command: cmd,
Type: TaskTypeCron,
Timeout: timeout,
WorkDir: workDir,
Envs: ParseEnvVars(envs),
Languages: languages,
UseMise: useMise,
// 构造执行请求的 Builder
reqBuilder := func() *ExecutionRequest {
return &ExecutionRequest{
TaskID: taskID,
Name: name,
Command: cmd,
Type: TaskTypeCron,
Timeout: timeout,
WorkDir: workDir,
Envs: ParseEnvVars(envs),
Languages: languages,
UseMise: useMise,
}
}
// 如果有关联的 Scheduler,加入队列执行
if m.scheduler != nil {
m.scheduler.EnqueueOrExecute(req)
randomRange := task.GetRandomRange()
if randomRange > 0 && m.scheduler != nil {
// 生成 0 到 randomRange 之间的随机秒数
delaySeconds := rand.Intn(randomRange)
delay := time.Duration(delaySeconds) * time.Second
m.logger.Infof("[CronManager] 任务 #%s 将随机延迟 %v (范围: %ds) 后入队执行", taskID, delay, randomRange)
// 使用调度器的延时投递功能,不阻塞当前 Cron 协程
m.scheduler.EnqueueDelayed(delay, reqBuilder)
} else {
m.logger.Infof("[CronManager] 触发计划任务 #%s (%s)", taskID, name)
if m.scheduler != nil {
m.scheduler.EnqueueOrExecute(reqBuilder())
}
}
// 触发下次运行时间更新事件
m.triggerNextRunEvent(taskID, req)
m.triggerNextRunEvent(taskID, &ExecutionRequest{TaskID: taskID})
})
if err != nil {
+1
View File
@@ -32,6 +32,7 @@ type CronTask interface {
Task
GetSchedule() string
UseMise() bool
GetRandomRange() int
}
// Request 任务执行请求