Files
bj_power/bj_power_mes/internal/processor/scheduler/scheduler.go
T

75 lines
2.0 KiB
Go

package scheduler
import "context"
// Scheduler 三层编排器——串联 TaskGenerator → ConstraintFilter → PolicyEngine。
// 骨架阶段:只定义接口和编排流程,不直接修改 processor 包。
// 后续阶段:processor 包的 JobRuntime 将通过此 Scheduler 替代直接调用 Dispatcher。
type Scheduler struct {
generator TaskGenerator
filter ConstraintFilter
policy PolicyEngine
}
func NewScheduler(g TaskGenerator, f ConstraintFilter, p PolicyEngine) *Scheduler {
return &Scheduler{
generator: g,
filter: f,
policy: p,
}
}
// ScheduleAll 对多个 Job 执行三层调度,合并结果后排序。
// 用于全局调度场景(如收到 MachineTaskComplete 信号后重新评估所有 Job)。
func (s *Scheduler) ScheduleAll(ctx context.Context, jobs []JobView, state SystemState) []CandidateTask {
var allCandidates []CandidateTask
for _, job := range jobs {
candidates := s.generator.Generate(job)
allCandidates = append(allCandidates, candidates...)
}
if len(allCandidates) == 0 {
return nil
}
feasible := s.filter.Filter(ctx, allCandidates, state)
if len(feasible) == 0 {
return nil
}
return s.policy.Rank(feasible, state)
}
// DefaultScheduler 创建默认配置的 Scheduler。
// 使用 RecipeTaskGenerator + 所有内置约束 + 默认优先级策略。
func DefaultScheduler() *Scheduler {
generator := NewRecipeTaskGenerator()
filter := NewCompositeFilter(
NewMachineDisabledConstraint(),
NewMachineBusyConstraint(),
NewMachineEmptyConstraint(),
NewTempSlotFullConstraint(),
NewOrderPausedConstraint(),
NewOrderPausingConstraint(),
NewOrderCancellingConstraint(),
NewJobSuspendedConstraint(),
NewExchangePairConstraint(),
NewReplenishConstraint(),
NewWasteReadyConstraint(),
)
policy := NewPriorityPolicy(
UnloadFirstRule,
SamplingFirstRule,
LaterStageUnloadFirstRule,
IdleMachineLoadFirstRule,
LaterStageLoadFirstRule,
ExchangeFirstRule,
BasePriorityRule,
JobIDSmallerFirstRule,
SameMachineRule,
)
return NewScheduler(generator, filter, policy)
}