From 1aec89c221f37f372a1c94c72b420fcafc39c39b Mon Sep 17 00:00:00 2001 From: yarnom Date: Thu, 30 Oct 2025 16:12:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=20pid=20=EF=BC=8C?= =?UTF-8?q?=E5=BB=B6=E8=BF=9FRtkrcvConfigService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sideslope/rtkcluster/GroupRtkScheduler.java | 16 +++++++++++----- .../sideslope/rtkcluster/RtkClusterService.java | 6 ++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/GroupRtkScheduler.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/GroupRtkScheduler.java index be70486c..b7a67354 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/GroupRtkScheduler.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/rtkcluster/GroupRtkScheduler.java @@ -28,7 +28,7 @@ public class GroupRtkScheduler { private static class RuntimeInfo { volatile String state = "stopped"; // starting|running|stopped|failed - volatile Integer pid; + volatile Long pid; volatile Integer workPort; // reserved for future use volatile String confPath; volatile LocalDateTime startedAt; @@ -76,7 +76,7 @@ public class GroupRtkScheduler { LOGGER.info("[scheduler] starting rtkrcv for group {} with {}", groupId, conf); Process p = pb.start(); rt.process = p; - rt.pid = tryGetPidCompat(p); + rt.pid = safePid(p); rt.state = "starting"; rt.startedAt = LocalDateTime.now(); startReader(groupId, rt); @@ -174,14 +174,20 @@ public class GroupRtkScheduler { rt.readerThread.start(); } - private Integer tryGetPidCompat(Process p) { + private Long safePid(Process p) { try { + // Try Java 9+ via reflection (keeps Java 8 compilation compatible) + java.lang.reflect.Method m = Process.class.getMethod("pid"); + Object v = m.invoke(p); + if (v instanceof Number) return ((Number) v).longValue(); + } catch (Exception ignore) {} + try { + // Fallback: reflect private 'pid' field (UNIXProcess on Java 8) java.lang.reflect.Field f = p.getClass().getDeclaredField("pid"); f.setAccessible(true); Object v = f.get(p); - if (v instanceof Integer) return (Integer) v; + if (v instanceof Number) return ((Number) v).longValue(); } catch (Exception ignore) {} return null; } } - 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 e81f6c7b..f2e71b81 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 @@ -46,6 +46,8 @@ public class RtkClusterService implements ApplicationRunner { private int startDelaySec; @Value("${rtkrcv.bin:rtkrcv}") private String rtkBinary; + @Value("${rtkcluster.autoStart:false}") + private boolean autoStart; @Autowired private RtkrcvProfileMapper profileMapper; @@ -68,6 +70,10 @@ public class RtkClusterService implements ApplicationRunner { @Override public void run(ApplicationArguments args) { + if (!autoStart) { + LOGGER.info("RtkClusterService autoStart disabled; skipping bootstrap."); + return; + } if (startDelaySec > 0) { try { LOGGER.info("RtkClusterService delayed start {}s to wait for 9902/9903", startDelaySec);