From 12a459854efce85e1e4ae94f3498615fc1862e85 Mon Sep 17 00:00:00 2001 From: dashixiong Date: Tue, 20 Jan 2026 17:21:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20modbus=20=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/modbus/config/ModbusProperties.java | 106 ++++++++++++++++++ .../quartz/config/ModbusExecutorConfig.java | 33 ++++++ 2 files changed, 139 insertions(+) create mode 100644 ems-common/src/main/java/com/xzzn/common/core/modbus/config/ModbusProperties.java create mode 100644 ems-quartz/src/main/java/com/xzzn/quartz/config/ModbusExecutorConfig.java diff --git a/ems-common/src/main/java/com/xzzn/common/core/modbus/config/ModbusProperties.java b/ems-common/src/main/java/com/xzzn/common/core/modbus/config/ModbusProperties.java new file mode 100644 index 0000000..8033721 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/core/modbus/config/ModbusProperties.java @@ -0,0 +1,106 @@ +package com.xzzn.common.core.modbus.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "modbus") +public class ModbusProperties { + + private PoolConfig pool = new PoolConfig(); + private TimeoutConfig timeout = new TimeoutConfig(); + + public PoolConfig getPool() { + return pool; + } + + public void setPool(PoolConfig pool) { + this.pool = pool; + } + + public TimeoutConfig getTimeout() { + return timeout; + } + + public void setTimeout(TimeoutConfig timeout) { + this.timeout = timeout; + } + + public static class PoolConfig { + private int maxTotal = 20; + private int maxIdle = 10; + private int minIdle = 3; + private long maxWait = 5000; + private long timeBetweenEvictionRuns = 30000; + private long minEvictableIdleTime = 60000; + + public int getMaxTotal() { + return maxTotal; + } + + public void setMaxTotal(int maxTotal) { + this.maxTotal = maxTotal; + } + + public int getMaxIdle() { + return maxIdle; + } + + public void setMaxIdle(int maxIdle) { + this.maxIdle = maxIdle; + } + + public int getMinIdle() { + return minIdle; + } + + public void setMinIdle(int minIdle) { + this.minIdle = minIdle; + } + + public long getMaxWait() { + return maxWait; + } + + public void setMaxWait(long maxWait) { + this.maxWait = maxWait; + } + + public long getTimeBetweenEvictionRuns() { + return timeBetweenEvictionRuns; + } + + public void setTimeBetweenEvictionRuns(long timeBetweenEvictionRuns) { + this.timeBetweenEvictionRuns = timeBetweenEvictionRuns; + } + + public long getMinEvictableIdleTime() { + return minEvictableIdleTime; + } + + public void setMinEvictableIdleTime(long minEvictableIdleTime) { + this.minEvictableIdleTime = minEvictableIdleTime; + } + } + + public static class TimeoutConfig { + private int read = 10000; + private int write = 5000; + + public int getRead() { + return read; + } + + public void setRead(int read) { + this.read = read; + } + + public int getWrite() { + return write; + } + + public void setWrite(int write) { + this.write = write; + } + } +} diff --git a/ems-quartz/src/main/java/com/xzzn/quartz/config/ModbusExecutorConfig.java b/ems-quartz/src/main/java/com/xzzn/quartz/config/ModbusExecutorConfig.java new file mode 100644 index 0000000..128a2ca --- /dev/null +++ b/ems-quartz/src/main/java/com/xzzn/quartz/config/ModbusExecutorConfig.java @@ -0,0 +1,33 @@ +package com.xzzn.quartz.config; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.annotation.PreDestroy; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Modbus操作执行器配置 + * 所有Modbus读写操作必须通过此单线程执行器串行执行,避免并发访问导致通讯故障 + */ +@Configuration +public class ModbusExecutorConfig { + + private final ExecutorService modbusExecutor = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r, "modbus-io-thread"); + t.setDaemon(false); + return t; + }); + + @Bean(name = "modbusExecutor") + public ExecutorService modbusExecutor() { + return modbusExecutor; + } + + @PreDestroy + public void shutdown() { + modbusExecutor.shutdown(); + } +}