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