Files
collector/internal/logic/boot.go
yanweidong 8bae04bc5e feat(logic): 优化数据采集器启动流程并增加节点状态管理功能
- 移除配置参数依赖,改为直接调用Boot()函数
- 添加主机名自动获取和设置功能
- 新增SaveNodeStatus函数用于保存节点状态数据
- 在数据变化时同时保存节点状态信息
- 创建CollectorNode数据库模型用于存储节点状态
2026-04-24 09:40:48 +08:00

117 lines
2.7 KiB
Go

package logic
import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/robfig/cron/v3"
)
var (
COLLECTOR_URL = "http://localhost:5000/status"
COLLECTION_INTERVAL = 30
HOSTNAME = "localhost"
)
func Boot() {
log.Println("=== QMT数据采集器启动 ===")
log.Printf("采集地址: %s", COLLECTOR_URL)
log.Printf("采集间隔: %d秒", COLLECTION_INTERVAL)
host, err := os.Hostname()
if err != nil {
panic(fmt.Errorf("获取主机名失败: %v", err))
} else {
HOSTNAME = host
}
log.Printf("主机名称: %s", HOSTNAME)
// 创建采集器
coll := NewCollector(COLLECTOR_URL)
// 启动时检查并补全订单簿数据
// CheckAndRepairOrderBooks(cfg.AccountID)
// 创建cron调度器
c := cron.New(cron.WithSeconds())
// 构建cron表达式 (每N秒执行一次)
cronSpec := fmt.Sprintf("@every %ds", COLLECTION_INTERVAL)
log.Printf("定时任务表达式: %s", cronSpec)
// 添加定时任务
_, err = c.AddFunc(cronSpec, func() {
runCollection(coll)
})
if err != nil {
log.Fatalf("添加定时任务失败: %v", err)
}
// 启动调度器
c.Start()
log.Println("定时任务已启动")
// 等待退出信号
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("收到退出信号,正在关闭...")
c.Stop()
log.Println("采集器已停止")
}
// runCollection 执行一次数据采集和存储
func runCollection(coll *Collector) {
// 检查是否为开市时间
now := time.Now()
if !IsTradingTime(now) {
return
}
log.Println("开始采集...")
// 采集数据并检查变化
status, dataHash, changed, err := coll.CollectAndCheck()
if err != nil {
log.Printf("采集失败: %v", err)
return
}
log.Printf("数据哈希: %s", dataHash)
log.Printf("数据是否变化: %v", changed)
// 如果数据没有变化,只记录日志
if !changed {
log.Println("数据未变化,跳过存储")
return
}
// 数据有变化,保存到数据库
log.Println("数据已变化,开始存储到数据库...")
if err := SaveData(status); err != nil {
log.Printf("保存数据失败: %v", err)
return
}
// 保存节点状态(有则更新,没有则新增)
if err := SaveNodeStatus(&status.Status); err != nil {
log.Printf("保存节点状态失败: %v", err)
return
}
// 记录成功的日志
// if err := store.SaveCollectionLog(dataHash, ymd, true, "数据保存成功"); err != nil {
// log.Printf("保存采集日志失败: %v", err)
// }
log.Printf("数据存储成功 - 资产账户: %s, 订单数: %d, 持仓数: %d, 行情数: %d",
status.Data.Assets.AccountID,
len(status.Data.Orders),
len(status.Data.Positions),
len(status.Data.TickData))
}