实现定时采集
This commit is contained in:
89
internal/domain/collection/timed_collector.go
Normal file
89
internal/domain/collection/timed_collector.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package collection
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/domain/device"
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"
|
||||
)
|
||||
|
||||
// TimedCollector 实现了 Collector 接口,用于定时从数据库获取设备信息并下发采集指令
|
||||
type TimedCollector struct {
|
||||
deviceRepo repository.DeviceRepository
|
||||
deviceService device.Service
|
||||
logger *logs.Logger
|
||||
interval time.Duration
|
||||
ticker *time.Ticker
|
||||
done chan bool
|
||||
}
|
||||
|
||||
// NewTimedCollector 创建一个定时采集器实例
|
||||
func NewTimedCollector(
|
||||
deviceRepo repository.DeviceRepository,
|
||||
deviceService device.Service,
|
||||
logger *logs.Logger,
|
||||
interval time.Duration,
|
||||
) Collector {
|
||||
return &TimedCollector{
|
||||
deviceRepo: deviceRepo,
|
||||
deviceService: deviceService,
|
||||
logger: logger,
|
||||
interval: interval,
|
||||
done: make(chan bool),
|
||||
}
|
||||
}
|
||||
|
||||
// Start 开始定时采集
|
||||
func (c *TimedCollector) Start() {
|
||||
c.logger.Infof("定时采集器启动,采集间隔: %s", c.interval)
|
||||
c.ticker = time.NewTicker(c.interval)
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-c.done:
|
||||
return
|
||||
case <-c.ticker.C:
|
||||
c.collect()
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// Stop 停止定时采集
|
||||
func (c *TimedCollector) Stop() {
|
||||
c.logger.Info("定时采集器停止")
|
||||
c.ticker.Stop()
|
||||
c.done <- true
|
||||
}
|
||||
|
||||
// collect 是核心的采集逻辑
|
||||
func (c *TimedCollector) collect() {
|
||||
c.logger.Info("开始新一轮的设备数据采集")
|
||||
|
||||
sensors, err := c.deviceRepo.ListAllSensors()
|
||||
if err != nil {
|
||||
c.logger.Errorf("采集周期: 从数据库获取所有传感器失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if len(sensors) == 0 {
|
||||
c.logger.Info("采集周期: 未发现任何传感器设备,跳过本次采集")
|
||||
return
|
||||
}
|
||||
|
||||
sensorsByController := make(map[uint][]*models.Device)
|
||||
for _, sensor := range sensors {
|
||||
sensorsByController[sensor.AreaControllerID] = append(sensorsByController[sensor.AreaControllerID], sensor)
|
||||
}
|
||||
|
||||
for controllerID, controllerSensors := range sensorsByController {
|
||||
c.logger.Infof("采集周期: 准备为区域主控 %d 下的 %d 个传感器下发采集指令", controllerID, len(controllerSensors))
|
||||
if err := c.deviceService.Collect(controllerID, controllerSensors); err != nil {
|
||||
c.logger.Errorf("采集周期: 为区域主控 %d 下发采集指令失败: %v", controllerID, err)
|
||||
}
|
||||
}
|
||||
|
||||
c.logger.Info("本轮设备数据采集完成")
|
||||
}
|
||||
Reference in New Issue
Block a user