package com.ruoyi.config; import java.time.Duration; import java.time.Instant; import java.util.List; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.ruoyi.device.bts.BtsDevelopmentSimulator; import com.ruoyi.device.discovery.DeviceDiscoveryCandidateStore; import com.ruoyi.device.discovery.DeviceDiscoveryCandidateStore.CollectorCandidate; /** 将模拟采集器的发现和实时状态写入 Redis,不回写正式 MySQL 记录。 */ @Component public class DevelopmentCollectorStatusSynchronizer { private final BtsDevelopmentSimulator simulator; private final DeviceDiscoveryCandidateStore candidateStore; public DevelopmentCollectorStatusSynchronizer(BtsDevelopmentSimulator simulator, DeviceDiscoveryCandidateStore candidateStore) { this.simulator = simulator; this.candidateStore = candidateStore; } /** 完整替换 dev-sim 采集器快照,删除配置后候选立即消失。 */ @Scheduled(fixedDelay = BtsDevelopmentSimulator.POLL_INTERVAL_MS) public synchronized void synchronizeOnlineStatus() { Instant observedAt = Instant.now(); List candidates = simulator.snapshot().collectors().stream() .map(item -> new CollectorCandidate(BtsDevelopmentSimulator.ADAPTER_CODE, item.deviceCode(), item.ip(), item.mac(), item.name(), item.manufacturer(), item.model(), item.channelCount(), item.online(), observedAt, observedAt.plus(Duration.ofSeconds(30)))) .toList(); candidateStore.replaceCollectors(BtsDevelopmentSimulator.ADAPTER_CODE, candidates); } }