forked from goffee/cup
71 lines
2.4 KiB
Go
71 lines
2.4 KiB
Go
// Copyright (c) 2025 Zeni Kim <zenik@smarteching.com>
|
|
// 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(2000 * 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())
|
|
}
|