# scheduler-backend

独立的调度中心后端工程，负责：

- 管理 API
- 本地 Go handler 注册
- 手动执行
- `gocron` 定时执行
- MongoDB 中的任务配置与执行记录存储

## 当前能力

- `GET /admin/scheduler/handlers`
- `GET /admin/scheduler/jobs`
- `GET /admin/scheduler/jobs/:id`
- `POST /admin/scheduler/jobs`
- `PUT /admin/scheduler/jobs/:id`
- `POST /admin/scheduler/jobs/:id/toggle`
- `POST /admin/scheduler/jobs/:id/run`
- `GET /admin/scheduler/executions`

## 目录结构

```text
cmd/api                 管理 API 入口
cmd/worker              调度执行入口
internal/api            Gin 路由
internal/executor       本地 handler 执行
internal/jobdef         handler 定义与注册
internal/scheduler      gocron 调度服务
internal/store/model    Mongo 文档模型
internal/store/mongo    Mongo 连接与存储实现
pkg/config              环境配置加载
pkg/log                 日志封装
```

## 环境变量

默认会按下面顺序读取：

1. `.env`
2. `.env.<APP_ENV|GO_ENV|ENV>`
3. `.env.local`

外部进程环境变量优先级更高，不会被文件覆盖。

关键变量：

```env
HTTP_PORT=16811
WORKER_HTTP_PORT=16812
MONGO_HOST=47.237.103.4
MONGO_PORT=27017
MONGO_USERNAME=
MONGO_PASSWORD=
MONGO_AUTHSOURCE=admin
MONGO_DATABASE=openim_v3
SCHEDULER_MONGO_DATABASE=scheduler_center
REDIS_ADDR=127.0.0.1:6379
REDIS_USERNAME=
REDIS_PASSWORD=
```

## 启动方式

### 一条命令启动后端

```bash
cd /Users/vet/all/workspace414/scheduler-backend
./start.sh
```

这个脚本会同时启动：

- `api`
- `worker`

并把运行信息写到：

- `logs/api.log`
- `logs/worker.log`

PID 文件会写到：

- `run/api.pid`
- `run/worker.pid`

停止方式：

```bash
cd /Users/vet/all/workspace414/scheduler-backend
./stop.sh
```

### 启动 API

```bash
cd /Users/vet/all/workspace414/scheduler-backend
GOWORK=off go run ./cmd/api
```

或直接运行：

```bash
./scripts/start-api.sh
```

默认监听：

```text
http://127.0.0.1:16811
```

### 启动 worker

```bash
cd /Users/vet/all/workspace414/scheduler-backend
GOWORK=off go run ./cmd/worker
```

或直接运行：

```bash
./scripts/start-worker.sh
```

worker 会：

- 连接 Mongo
- 暴露健康检查端口 `http://127.0.0.1:16812/healthz`
- 加载启用任务
- 跳过 `manual`
- 注册 `cron` 和 `interval`
- 到点写执行记录并执行本地 Go handler

## 初始化示例任务

会向 `scheduler_center.job_configs` 写入一条示例任务：

- `name=sample-job`
- `handlerKey=sample-handler`
- `enabled=false`
- `scheduleType=manual`
- `defaultParams={"limit":10,"dryRun":true}`

运行方式：

```bash
cd /Users/vet/all/workspace414/scheduler-backend
GOWORK=off go run ./cmd/tools/seed-sample-job
```

或直接运行：

```bash
./scripts/seed-sample-job.sh
```

## 测试与构建

```bash
cd /Users/vet/all/workspace414/scheduler-backend
GOWORK=off go test ./pkg/config ./internal/jobdef ./internal/store/model ./internal/executor -v
GOWORK=off go build ./cmd/api ./cmd/worker ./cmd/tools/seed-sample-job
```

## 当前限制

- 只支持本地 Go handler
- `interval` 依赖 `time.ParseDuration`，例如 `30s`、`5m`、`1h`
- 没有审批流
- 没有分布式多 worker 协调
- 执行记录详情页接口还没单独拆出
