mirror of
https://github.com/oarkflow/mq.git
synced 2025-10-05 16:06:55 +08:00
109 lines
3.1 KiB
Go
109 lines
3.1 KiB
Go
package main
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"time"
|
||
|
||
"github.com/oarkflow/mq"
|
||
"github.com/oarkflow/mq/examples/tasks"
|
||
)
|
||
|
||
func main() {
|
||
handler := tasks.SchedulerHandler
|
||
callback := tasks.SchedulerCallback
|
||
|
||
// Initialize the pool with various parameters.
|
||
pool := mq.NewPool(3,
|
||
mq.WithTaskQueueSize(5),
|
||
mq.WithMaxMemoryLoad(1000),
|
||
mq.WithHandler(handler),
|
||
mq.WithPoolCallback(callback),
|
||
mq.WithTaskStorage(mq.NewMemoryTaskStorage(10*time.Minute)),
|
||
)
|
||
scheduler := mq.NewScheduler(pool)
|
||
scheduler.Start()
|
||
ctx := context.Background()
|
||
|
||
// -------------------------------
|
||
// Special String Examples
|
||
// -------------------------------
|
||
|
||
// Task scheduled with @every for a duration of 30 seconds.
|
||
scheduler.AddTask(ctx, &mq.Task{ID: "Every 30 Seconds Task"},
|
||
mq.WithScheduleSpec("@every 30s"),
|
||
mq.WithRecurring(),
|
||
)
|
||
|
||
// Task scheduled with @every using a 1-minute duration.
|
||
scheduler.AddTask(ctx, &mq.Task{ID: "Every Minute Task"},
|
||
mq.WithScheduleSpec("@every 1m"),
|
||
mq.WithRecurring(),
|
||
)
|
||
|
||
// Task scheduled with @daily (runs at midnight by default).
|
||
scheduler.AddTask(ctx, &mq.Task{ID: "Daily Task"},
|
||
mq.WithScheduleSpec("@daily"),
|
||
mq.WithRecurring(),
|
||
)
|
||
|
||
// Task scheduled with @weekly (runs at midnight on Sundays).
|
||
scheduler.AddTask(ctx, &mq.Task{ID: "Weekly Task"},
|
||
mq.WithScheduleSpec("@weekly"),
|
||
mq.WithRecurring(),
|
||
)
|
||
|
||
// Task scheduled with @monthly (runs on the 1st of every month at midnight).
|
||
scheduler.AddTask(ctx, &mq.Task{ID: "Monthly Task"},
|
||
mq.WithScheduleSpec("@monthly"),
|
||
mq.WithRecurring(),
|
||
)
|
||
|
||
// Task scheduled with @yearly (or @annually) – runs on January 1st at midnight.
|
||
scheduler.AddTask(ctx, &mq.Task{ID: "Yearly Task"},
|
||
mq.WithScheduleSpec("@yearly"),
|
||
mq.WithRecurring(),
|
||
)
|
||
|
||
// -------------------------------
|
||
// Cron Spec Examples
|
||
// -------------------------------
|
||
|
||
// Example using a standard 5-field cron expression:
|
||
// "0 * * * *" means at minute 0 of every hour.
|
||
scheduler.AddTask(ctx, &mq.Task{ID: "Cron 5-field Task"},
|
||
mq.WithScheduleSpec("0 * * * *"),
|
||
mq.WithRecurring(),
|
||
)
|
||
|
||
// Example using an extended 6-field cron expression:
|
||
// "30 * * * * *" means at 30 seconds past every minute.
|
||
scheduler.AddTask(ctx, &mq.Task{ID: "Cron 6-field Task"},
|
||
mq.WithScheduleSpec("30 * * * * *"),
|
||
mq.WithRecurring(),
|
||
)
|
||
|
||
// -------------------------------
|
||
// Example Task Enqueuing (Immediate Tasks)
|
||
// -------------------------------
|
||
// These tasks are enqueued immediately into the pool queue.
|
||
pool.EnqueueTask(context.Background(), &mq.Task{ID: "Immediate Task 1"}, 1)
|
||
time.Sleep(1 * time.Second)
|
||
pool.EnqueueTask(context.Background(), &mq.Task{ID: "Immediate Task 2"}, 5)
|
||
|
||
time.Sleep(10 * time.Minute)
|
||
// Remove scheduled tasks after demonstration.
|
||
scheduler.RemoveTask("Every 30 Seconds Task")
|
||
scheduler.RemoveTask("Every Minute Task")
|
||
scheduler.RemoveTask("Daily Task")
|
||
scheduler.RemoveTask("Weekly Task")
|
||
scheduler.RemoveTask("Monthly Task")
|
||
scheduler.RemoveTask("Yearly Task")
|
||
scheduler.RemoveTask("Cron 5-field Task")
|
||
scheduler.RemoveTask("Cron 6-field Task")
|
||
scheduler.Close()
|
||
|
||
// Retrieve metrics, then stop the pool.
|
||
fmt.Println(pool.FormattedMetrics())
|
||
}
|