// Copyright (c) 2025 Zeni Kim // Use of this source code is governed by MIT-style // license that can be found in the LICENSE file. package main import ( "context" "encoding/json" "fmt" "log" "time" "git.smarteching.com/goffee/core" "git.smarteching.com/goffee/core/scheduler" "git.smarteching.com/goffee/cup/config" ) // ─── Scheduler task handlers ───────────────────────────────────────────────── // handleSendEmail processes a send_email scheduler task. func handleSendEmail(ctx context.Context, item *scheduler.QueueItem) error { var payload struct { To string `json:"to"` Subject string `json:"subject"` } if err := json.Unmarshal([]byte(item.Payload), &payload); err != nil { return fmt.Errorf("invalid send_email payload: %w", err) } log.Printf("[scheduler] [send_email] → to=%s subject=%q", payload.To, payload.Subject) time.Sleep(50 * time.Millisecond) // simulate I/O return nil } // handleFlakyTask demonstrates a task that always fails. func handleFlakyTask(ctx context.Context, item *scheduler.QueueItem) error { log.Printf("[scheduler] [flaky_task] attempting... payload=%s", item.Payload) time.Sleep(100 * time.Millisecond) return fmt.Errorf("external API returned 503 — simulated failure for demo") } // ─── Registration ──────────────────────────────────────────────────────────── // Register simple scheduler func registerScheduler() { var sched = new(core.Schedulermux) sched.SchedulerInit() //######################################## //# scheduler task registration ##### //######################################## // Register your scheduler task handlers here ... sched.AddWork("send_email", handleSendEmail) sched.AddWork("flaky_task", handleFlakyTask) //######################################## // Set the store (DB-backed) and start //######################################## // Create the store using the application's GORM DB st, err := scheduler.NewStore(core.ResolveGorm()) if err != nil { panic(fmt.Sprintf("scheduler: failed to create store: %v", err)) } sched.SetStore(st) // Start scheduler server in background, DO NOT TOUCH go sched.RunScheduler(config.GetSchedulerConfig()) }