From 131b0da71d9852763c63a4269a2357379fdc5241 Mon Sep 17 00:00:00 2001 From: yarnom Date: Wed, 29 Oct 2025 18:42:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rtkcluster/RtkClusterService.java | 10 ++++++++ .../rtkcluster/RtkrcvConfigService.java | 24 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkClusterService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkClusterService.java index f80e580a..e81f6c7b 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkClusterService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkClusterService.java @@ -42,6 +42,8 @@ public class RtkClusterService implements ApplicationRunner { @Value("${rtkrcv.workdir:/opt/rtk}") private String rtkWorkDir; + @Value("${rtk.start.delaySeconds:30}") + private int startDelaySec; @Value("${rtkrcv.bin:rtkrcv}") private String rtkBinary; @@ -66,6 +68,14 @@ public class RtkClusterService implements ApplicationRunner { @Override public void run(ApplicationArguments args) { + if (startDelaySec > 0) { + try { + LOGGER.info("RtkClusterService delayed start {}s to wait for 9902/9903", startDelaySec); + Thread.sleep(startDelaySec * 1000L); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } // Load all profiles and bootstrap endpoints and sessions. List profiles = profileMapper.selectList(null); if (profiles == null || profiles.isEmpty()) { diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkrcvConfigService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkrcvConfigService.java index 25ffcc09..8b858afc 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkrcvConfigService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/RtkrcvConfigService.java @@ -34,6 +34,10 @@ public class RtkrcvConfigService { @Value("${rtkrcv.workdir:/opt/rtk}") private String defaultWorkDir; + @Value("${rtk.start.delaySeconds:30}") + private int startDelaySec; + private final long beanInitAt = System.currentTimeMillis(); + private volatile boolean delayDone = false; @Autowired(required = false) private RtkrcvGroupMapper groupMapper; @@ -56,6 +60,7 @@ public class RtkrcvConfigService { * The output filename will be `rtkrcv_{deviceId}.conf` under the provided outputDir. */ public Path generateConfig(RtkrcvProfile profile, Path outputDir) throws IOException { + ensureStartupDelay(); if (profile == null) throw new IllegalArgumentException("profile must not be null"); if (profile.getDeviceId() == null || profile.getDeviceId().trim().isEmpty()) { throw new IllegalArgumentException("profile.deviceId must not be empty"); @@ -112,6 +117,25 @@ public class RtkrcvConfigService { return out; } + private void ensureStartupDelay() { + if (delayDone) return; + synchronized (this) { + if (delayDone) return; + long target = beanInitAt + (startDelaySec * 1000L); + long now = System.currentTimeMillis(); + long wait = target - now; + if (wait > 0) { + try { + LOGGER.info("RtkrcvConfigService delaying {} ms to wait for 9902/9903", wait); + Thread.sleep(wait); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + delayDone = true; + } + } + private Map loadGroupConfig(RtkrcvProfile profile) { Map map = new HashMap<>(); try {