package main
import (
"context"
"log/slog"
"net/http"
"os"
"time"
"github.com/reugn/go-quartz/job"
"github.com/reugn/go-quartz/logger"
"github.com/reugn/go-quartz/quartz"
)
func main() {
// 创建一个可取消的上下文,用于控制调度器和作业的生命周期
ctx, cancel := context.WithCancel(context.Background())
// 确保在函数结束时取消上下文,防止资源泄露
defer cancel()
// 创建调度器并配置日志记录器
// 1. 首先创建标准日志处理器输出到标准输出
slogLogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
// 2. 使用WithLogger选项创建标准调度器,忽略可能的错误
scheduler, _ := quartz.NewStdScheduler(quartz.WithLogger(logger.NewSlogLogger(ctx, slogLogger)))
// 启动调度器,开始处理作业
scheduler.Start(ctx)
// 创建不同类型的作业和触发器
// 1. 创建一个Cron触发器,每5秒执行一次 (1/5 * * * * *)
cronTrigger, _ := quartz.NewCronTrigger("1/5 * * * * *")
// 2. 创建一个执行Shell命令的作业
shellJob := job.NewShellJob("ls -la")
// 3. 创建一个HTTP请求,用于后续的CURL作业
request, _ := http.NewRequest(http.MethodGet, "https://worldtimeapi.org/api/timezone/utc", nil)
// 4. 创建一个发送HTTP请求的作业
curlJob := job.NewCurlJob(request)
// 5. 创建一个执行自定义函数的作业
functionJob := job.NewFunctionJob(func(_ context.Context) (int, error) { return 1, nil })
// 向调度器注册作业
// 1. 注册shellJob,使用cronTrigger触发器
_ = scheduler.ScheduleJob(quartz.NewJobDetail(shellJob, quartz.NewJobKey("shellJob")),
cronTrigger)
// 2. 注册curlJob,使用SimpleTrigger,每7秒执行一次
_ = scheduler.ScheduleJob(quartz.NewJobDetail(curlJob, quartz.NewJobKey("curlJob")),
quartz.NewSimpleTrigger(7*time.Second))
// 3. 注册functionJob,使用SimpleTrigger,每5秒执行一次
_ = scheduler.ScheduleJob(quartz.NewJobDetail(functionJob, quartz.NewJobKey("functionJob")),
quartz.NewSimpleTrigger(5*time.Second))
// 停止调度器,不再接受新的作业
scheduler.Stop()
// 等待所有正在执行的作业完成
scheduler.Wait(ctx)
}