yeg
2026-08-26 de98fe81cca90dd855e0519f065e77fce56333ef
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;
        }
    }
}