package docker import ( "context" "sync" "time" "gorm.io/gorm" ) // ContainerMonitor 容器监控器 type ContainerMonitor struct { db *gorm.DB interval time.Duration robots map[string]struct{} // 记录正在监控的机器人容器ID mutex sync.RWMutex stopChan chan struct{} monitorActive bool } // NewContainerMonitor 创建容器监控器 func NewContainerMonitor(db *gorm.DB, interval time.Duration) *ContainerMonitor { if interval == 0 { interval = 30 * time.Second // 默认30秒检查一次 } return &ContainerMonitor{ db: db, interval: interval, robots: make(map[string]struct{}), stopChan: make(chan struct{}), } } // Start 启动监控 func (m *ContainerMonitor) Start(ctx context.Context) { //m.mutex.Lock() //if m.monitorActive { // m.mutex.Unlock() // return //} //m.monitorActive = true //m.mutex.Unlock() // //log.Println("Starting container monitor...") // //// 启动监控协程 //go func() { // ticker := time.NewTicker(m.interval) // defer ticker.Stop() // // for { // select { // case <-ticker.C: // m.checkRobots(context.Background()) // case <-m.stopChan: // log.Println("Container monitor stopped") // return // case <-ctx.Done(): // log.Println("Container monitor stopped due to context cancellation") // return // } // } //}() } // Stop 停止监控 func (m *ContainerMonitor) Stop() { m.mutex.Lock() defer m.mutex.Unlock() if m.monitorActive { close(m.stopChan) m.monitorActive = false } } // AddRobot 添加机器人到监控列表 func (m *ContainerMonitor) AddRobot(containerID string) { m.mutex.Lock() defer m.mutex.Unlock() m.robots[containerID] = struct{}{} } // RemoveRobot 从监控列表中移除机器人 func (m *ContainerMonitor) RemoveRobot(containerID string) { m.mutex.Lock() defer m.mutex.Unlock() delete(m.robots, containerID) } // checkRobots 检查所有机器人状态 //func (m *ContainerMonitor) checkRobots(ctx context.Context) { // m.mutex.RLock() // robotIDs := make([]string, 0, len(m.robots)) // for id := range m.robots { // robotIDs = append(robotIDs, id) // } // m.mutex.RUnlock() // // for _, containerID := range robotIDs { // // 使用新的上下文,避免一个检查失败影响其他检查 // checkCtx, cancel := context.WithTimeout(ctx, 10*time.Second) // defer cancel() // // // 获取机器人的当前状态 // status, errMsg, err := GetWechatBotStatus(checkCtx, containerID) // if err != nil { // log.Printf("Error checking robot %s: %v", containerID, err) // continue // } // // // 更新数据库中的状态 // robot := &model.Robot{} // result := m.db.Where("container_id = ?", containerID).First(robot) // if result.Error != nil { // log.Printf("Error finding robot %s in database: %v", containerID, result.Error) // continue // } // // // 只有状态变化时才更新 // if robot.Status != status { // robot.Status = status // robot.ErrorMessage = errMsg // // // 如果状态变为在线,更新登录时间 // if status == model.RobotStatusOnline { // now := time.Now() // robot.LastLoginAt = &now // } // // if err := m.db.Save(robot).Error; err != nil { // log.Printf("Error updating robot %s status: %v", containerID, err) // } else { // log.Printf("Robot %s status updated to %s", containerID, status) // } // } // } //}