From de98fe81cca90dd855e0519f065e77fce56333ef Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期三, 26 八月 2026 16:28:30 +0800
Subject: [PATCH] fix(device): address adapter discovery review

---
 ruoyi-device/src/main/java/com/ruoyi/device/registry/DeviceAdapterRegistry.java |   91 ++++++++++++++++++++++++++++++++++++---------
 1 files changed, 72 insertions(+), 19 deletions(-)

diff --git a/ruoyi-device/src/main/java/com/ruoyi/device/registry/DeviceAdapterRegistry.java b/ruoyi-device/src/main/java/com/ruoyi/device/registry/DeviceAdapterRegistry.java
index b4d8895..bda7ccf 100644
--- a/ruoyi-device/src/main/java/com/ruoyi/device/registry/DeviceAdapterRegistry.java
+++ b/ruoyi-device/src/main/java/com/ruoyi/device/registry/DeviceAdapterRegistry.java
@@ -5,6 +5,8 @@
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.function.Function;
 import com.ruoyi.device.api.DeviceAdapter;
 
 /** 管理启用设备适配器的运行时实例及其会话生命周期。 */
@@ -23,7 +25,7 @@
     }
 
     /** 按持久化配置注册、替换或移除运行时实例。 */
-    public synchronized void synchronize(AdapterInstanceConfig config)
+    public void synchronize(AdapterInstanceConfig config)
     {
         Objects.requireNonNull(config, "config");
         if (!config.enabled())
@@ -32,23 +34,42 @@
             return;
         }
 
-        RegisteredAdapter current = adapters.get(config.adapterCode());
-        if (current != null && current.config().equals(config)) return;
+        RegisteredAdapter previous;
+        synchronized (this)
+        {
+            RegisteredAdapter current = adapters.get(config.adapterCode());
+            if (current != null && current.config.equals(config)) return;
 
-        DeviceAdapterFactory factory = factories.get(normalizeType(config.adapterType()));
-        if (factory == null) throw new AdapterRegistryException("Unsupported device adapter type: " + config.adapterType());
+            DeviceAdapterFactory factory = factories.get(normalizeType(config.adapterType()));
+            if (factory == null)
+                throw new AdapterRegistryException("Unsupported device adapter type: " + config.adapterType());
 
-        DeviceAdapter replacement = factory.create(config);
-        RegisteredAdapter previous = adapters.put(config.adapterCode(), new RegisteredAdapter(config, replacement));
-        if (previous != null) previous.adapter().close();
+            DeviceAdapter replacement = factory.create(config);
+            previous = adapters.put(config.adapterCode(), new RegisteredAdapter(config, replacement));
+        }
+        closeWhenIdle(previous);
     }
 
-    /** 返回已启用适配器;未注册时给出可识别失败。 */
-    public synchronized DeviceAdapter require(String adapterCode)
+    /** 在实例级串行边界内执行一次适配器操作;未注册时给出可识别失败。 */
+    public <T> T execute(String adapterCode, Function<DeviceAdapter, T> operation)
     {
-        RegisteredAdapter registered = adapters.get(adapterCode);
-        if (registered == null) throw new AdapterRegistryException("Device adapter is not enabled: " + adapterCode);
-        return registered.adapter();
+        Objects.requireNonNull(operation, "operation");
+        RegisteredAdapter registered;
+        synchronized (this)
+        {
+            registered = adapters.get(adapterCode);
+            if (registered == null)
+                throw new AdapterRegistryException("Device adapter is not enabled: " + adapterCode);
+            registered.operationLock.lock();
+        }
+        try
+        {
+            return operation.apply(registered.adapter);
+        }
+        finally
+        {
+            registered.operationLock.unlock();
+        }
     }
 
     public synchronized boolean contains(String adapterCode)
@@ -57,16 +78,39 @@
     }
 
     @Override
-    public synchronized void close()
+    public void close()
     {
-        adapters.values().forEach(registered -> registered.adapter().close());
-        adapters.clear();
+        List<RegisteredAdapter> registered;
+        synchronized (this)
+        {
+            registered = List.copyOf(adapters.values());
+            adapters.clear();
+        }
+        registered.forEach(this::closeWhenIdle);
     }
 
     private void remove(String adapterCode)
     {
-        RegisteredAdapter previous = adapters.remove(adapterCode);
-        if (previous != null) previous.adapter().close();
+        RegisteredAdapter previous;
+        synchronized (this)
+        {
+            previous = adapters.remove(adapterCode);
+        }
+        closeWhenIdle(previous);
+    }
+
+    private void closeWhenIdle(RegisteredAdapter registered)
+    {
+        if (registered == null) return;
+        registered.operationLock.lock();
+        try
+        {
+            registered.adapter.close();
+        }
+        finally
+        {
+            registered.operationLock.unlock();
+        }
     }
 
     private static String normalizeType(String value)
@@ -74,7 +118,16 @@
         return Objects.requireNonNull(value, "adapterType").trim().toUpperCase(Locale.ROOT);
     }
 
-    private record RegisteredAdapter(AdapterInstanceConfig config, DeviceAdapter adapter)
+    private static final class RegisteredAdapter
     {
+        private final AdapterInstanceConfig config;
+        private final DeviceAdapter adapter;
+        private final ReentrantLock operationLock = new ReentrantLock(true);
+
+        private RegisteredAdapter(AdapterInstanceConfig config, DeviceAdapter adapter)
+        {
+            this.config = config;
+            this.adapter = adapter;
+        }
     }
 }

--
Gitblit v1.7.1