#
Junjie
19 小时以前 0c5a58771fcf86ad0b562829fbfa440da9392703
#
9个文件已修改
1个文件已删除
558 ■■■■ 已修改文件
src/main/java/com/zy/common/model/Shelves.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/ServerBootstrap.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/network/ZyCrnConnectDriver.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/network/ZyRgvConnectDriver.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/network/ZyStationConnectDriver.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/ZyRgvThread.java 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/impl/ZyStationThread.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/Shelves.java
File was deleted
src/main/java/com/zy/core/MainProcess.java
@@ -55,6 +55,8 @@
                }
            }
        });
        thread.setName("MainProcess");
        thread.setDaemon(true);
        thread.start();
    }
src/main/java/com/zy/core/ServerBootstrap.java
@@ -17,7 +17,6 @@
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.PreDestroy;
import java.util.List;
/**
@@ -92,7 +91,10 @@
                throw new CoolException("未知的线程实现");
            }
            new Thread(thread).start();
            Thread t = new Thread(thread);
            t.setName("CrnThread-" + deviceConfig.getDeviceNo());
            t.setDaemon(true);
            t.start();
            SlaveConnection.put(SlaveType.Crn, deviceConfig.getDeviceNo(), thread);
        }
@@ -107,7 +109,10 @@
                throw new CoolException("未知的线程实现");
            }
            new Thread(thread).start();
            Thread t = new Thread(thread);
            t.setName("DevpThread-" + deviceConfig.getDeviceNo());
            t.setDaemon(true);
            t.start();
            SlaveConnection.put(SlaveType.Devp, deviceConfig.getDeviceNo(), thread);
        }
@@ -122,40 +127,13 @@
                throw new CoolException("未知的线程实现");
            }
            new Thread(thread).start();
            Thread t = new Thread(thread);
            t.setName("RgvThread-" + deviceConfig.getDeviceNo());
            t.setDaemon(true);
            t.start();
            SlaveConnection.put(SlaveType.Rgv, deviceConfig.getDeviceNo(), thread);
        }
    }
    @PreDestroy
    public void destroy() {
        try {
            List<DeviceConfig> crnList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                    .eq("device_type", String.valueOf(SlaveType.Crn)));
            for (DeviceConfig deviceConfig : crnList) {
                SlaveConnection.remove(SlaveType.Crn, deviceConfig.getDeviceNo());
            }
        } catch (Exception ignore) {}
        try {
            List<DeviceConfig> devpList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                    .eq("device_type", String.valueOf(SlaveType.Devp)));
            for (DeviceConfig deviceConfig : devpList) {
                SlaveConnection.remove(SlaveType.Devp, deviceConfig.getDeviceNo());
            }
        } catch (Exception ignore) {}
        try {
            List<DeviceConfig> rgvList = deviceConfigService.selectList(new EntityWrapper<DeviceConfig>()
                    .eq("device_type", String.valueOf(SlaveType.Rgv)));
            for (DeviceConfig deviceConfig : rgvList) {
                SlaveConnection.remove(SlaveType.Rgv, deviceConfig.getDeviceNo());
            }
        } catch (Exception ignore) {}
        try {
            mainProcess.shutDown();
        } catch (Exception ignore) {}
    }
}
src/main/java/com/zy/core/network/ZyCrnConnectDriver.java
@@ -9,6 +9,10 @@
import com.zy.core.network.fake.ZyCrnFakeConnect;
import com.zy.core.network.real.ZyCrnRealConnect;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
/**
 * 连接驱动
@@ -20,29 +24,15 @@
    private DeviceConfig deviceConfig;
    private ZyCrnConnectApi zyCrnConnectApi;
    private volatile boolean closed = false;
    private Thread selfThread;
    private ScheduledExecutorService executor;
    public ZyCrnConnectDriver(DeviceConfig deviceConfig) {
        this.deviceConfig = deviceConfig;
    }
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        selfThread = Thread.currentThread();
        while (!closed && !Thread.currentThread().isInterrupted()) {
            try {
                if (!connected) {
                    connect();
                }
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    @Override
@@ -61,9 +51,9 @@
    @Override
    public void close() {
        closed = true;
        Thread t = selfThread;
        if (t != null) {
            try { t.interrupt(); } catch (Exception ignore) {}
        ScheduledExecutorService ex = executor;
        if (ex != null) {
            try { ex.shutdownNow(); } catch (Exception ignore) {}
        }
        if (zyCrnConnectApi != null) {
            zyCrnConnectApi.disconnect();
@@ -73,8 +63,27 @@
    }
    public void start() {
        Thread t = new Thread(this);
        t.start();
        executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setName("CrnConnect-" + deviceConfig.getDeviceNo());
                t.setDaemon(true);
                return t;
            }
        });
        executor.scheduleAtFixedRate(() -> {
            if (closed || Thread.currentThread().isInterrupted()) {
                return;
            }
            try {
                if (!connected) {
                    connect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, 0, 1000, TimeUnit.MILLISECONDS);
    }
    public ZyCrnStatusEntity getStatus() {
src/main/java/com/zy/core/network/ZyRgvConnectDriver.java
@@ -9,6 +9,10 @@
import com.zy.core.network.fake.ZyRgvFakeConnect;
import com.zy.core.network.real.ZyRgvRealConnect;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
@Slf4j
public class ZyRgvConnectDriver implements ThreadHandler {
@@ -16,29 +20,15 @@
    private DeviceConfig deviceConfig;
    private ZyRgvConnectApi zyRgvConnectApi;
    private volatile boolean closed = false;
    private Thread selfThread;
    private ScheduledExecutorService executor;
    public ZyRgvConnectDriver(DeviceConfig deviceConfig) {
        this.deviceConfig = deviceConfig;
    }
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        selfThread = Thread.currentThread();
        while (!closed && !Thread.currentThread().isInterrupted()) {
            try {
                if (!connected) {
                    connect();
                }
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    @Override
@@ -56,9 +46,9 @@
    @Override
    public void close() {
        closed = true;
        Thread t = selfThread;
        if (t != null) {
            try { t.interrupt(); } catch (Exception ignore) {}
        ScheduledExecutorService ex = executor;
        if (ex != null) {
            try { ex.shutdownNow(); } catch (Exception ignore) {}
        }
        if (zyRgvConnectApi != null) {
            zyRgvConnectApi.disconnect();
@@ -68,8 +58,27 @@
    }
    public void start() {
        Thread t = new Thread(this);
        t.start();
        executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setName("RgvConnect-" + deviceConfig.getDeviceNo());
                t.setDaemon(true);
                return t;
            }
        });
        executor.scheduleAtFixedRate(() -> {
            if (closed || Thread.currentThread().isInterrupted()) {
                return;
            }
            try {
                if (!connected) {
                    connect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, 0, 1000, TimeUnit.MILLISECONDS);
    }
    public ZyRgvStatusEntity getStatus() {
src/main/java/com/zy/core/network/ZyStationConnectDriver.java
@@ -10,6 +10,10 @@
import com.zy.core.network.fake.ZyStationFakeConnect;
import com.zy.core.network.real.ZyStationRealConnect;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
/**
 * 输送站连接驱动
@@ -21,29 +25,15 @@
    private DeviceConfig deviceConfig;
    private ZyStationConnectApi zyStationConnectApi;
    private volatile boolean closed = false;
    private Thread selfThread;
    private ScheduledExecutorService executor;
    public ZyStationConnectDriver(DeviceConfig deviceConfig) {
        this.deviceConfig = deviceConfig;
    }
    @Override
    @SuppressWarnings("InfiniteLoopStatement")
    public void run() {
        selfThread = Thread.currentThread();
        while (!closed && !Thread.currentThread().isInterrupted()) {
            try {
                if (!connected) {
                    connect();
                }
                Thread.sleep(1000);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    @Override
@@ -62,9 +52,9 @@
    @Override
    public void close() {
        closed = true;
        Thread t = selfThread;
        if (t != null) {
            try { t.interrupt(); } catch (Exception ignore) {}
        ScheduledExecutorService ex = executor;
        if (ex != null) {
            try { ex.shutdownNow(); } catch (Exception ignore) {}
        }
        if (zyStationConnectApi != null) {
            zyStationConnectApi.disconnect();
@@ -74,8 +64,28 @@
    }
    public void start() {
        Thread t = new Thread(this);
        t.start();
        executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setName("DevpConnect-" + deviceConfig.getDeviceNo());
                t.setDaemon(true);
                return t;
            }
        });
        executor.scheduleAtFixedRate(() -> {
            if (closed || Thread.currentThread().isInterrupted()) {
                return;
            }
            try {
                if (!connected) {
                    connect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, 0, 1000, TimeUnit.MILLISECONDS);
    }
    public List<ZyStationStatusEntity> getStatus() {
src/main/java/com/zy/core/thread/impl/ZyRgvThread.java
@@ -30,6 +30,10 @@
import java.text.MessageFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
@Data
@Slf4j
@@ -41,7 +45,8 @@
    private RgvProtocol rgvProtocol;
    private int deviceLogCollectTime = 200;
    private volatile boolean closed = false;
    private Thread mainThread;
    private ScheduledExecutorService readExecutor;
    private ScheduledExecutorService processExecutor;
    public ZyRgvThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
        this.deviceConfig = deviceConfig;
@@ -53,33 +58,53 @@
    public void run() {
        connect();
        initRgv();
        mainThread = Thread.currentThread();
        while (!closed && !Thread.currentThread().isInterrupted()) {
        readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setName("RgvReader-" + deviceConfig.getDeviceNo());
                t.setDaemon(true);
                return t;
            }
        });
        readExecutor.scheduleAtFixedRate(() -> {
            if (closed || Thread.currentThread().isInterrupted()) {
                return;
            }
            try {
                deviceLogCollectTime = Utils.getDeviceLogCollectTime();
                readStatus();
            } catch (Exception e) {
                log.error("RgvThread Fail", e);
            }
        }, 0, 200, TimeUnit.MILLISECONDS);
        processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setName("RgvWriter-" + deviceConfig.getDeviceNo());
                t.setDaemon(true);
                return t;
            }
        });
        processExecutor.scheduleAtFixedRate(() -> {
            if (closed || Thread.currentThread().isInterrupted()) {
                return;
            }
            try {
                int step = 1;
                Task task = MessageQueue.poll(SlaveType.Rgv, deviceConfig.getDeviceNo());
                if (task != null) {
                    step = task.getStep();
                }
                switch (step) {
                    case 1:
                        readStatus();
                        break;
                    case 2:
                        sendCommand((RgvCommand) task.getData());
                        break;
                    default:
                        break;
                if (step == 2 && task != null) {
                    sendCommand((RgvCommand) task.getData());
                }
                Thread.sleep(200);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        }, 0, 200, TimeUnit.MILLISECONDS);
    }
    private void initRgv() {
@@ -158,13 +183,17 @@
    @Override
    public void close() {
        closed = true;
        Thread t = mainThread;
        if (t != null) {
            try { t.interrupt(); } catch (Exception ignore) {}
        }
        if (zyRgvConnectDriver != null) {
            zyRgvConnectDriver.close();
        }
        ScheduledExecutorService ex = readExecutor;
        if (ex != null) {
            try { ex.shutdownNow(); } catch (Exception ignore) {}
        }
        ScheduledExecutorService px = processExecutor;
        if (px != null) {
            try { px.shutdownNow(); } catch (Exception ignore) {}
        }
    }
    @Override
src/main/java/com/zy/core/thread/impl/ZySiemensCrnThread.java
@@ -12,7 +12,6 @@
import com.zy.asrs.service.BasCrnpOptService;
import com.zy.asrs.utils.Utils;
import com.zy.common.utils.RedisUtil;
import com.zy.core.News;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.OutputQueue;
import com.zy.core.enums.CrnTaskModeType;
@@ -31,6 +30,10 @@
import java.text.MessageFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
/**
 * 堆垛机线程
@@ -46,7 +49,8 @@
    private int deviceLogCollectTime = 200;
    private boolean resetFlag = false;
    private volatile boolean closed = false;
    private Thread mainThread;
    private ScheduledExecutorService readExecutor;
    private ScheduledExecutorService processExecutor;
    public ZySiemensCrnThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
        this.deviceConfig = deviceConfig;
@@ -58,33 +62,53 @@
    public void run() {
        this.connect();
        this.initCrn();
        mainThread = Thread.currentThread();
        while (!closed && !Thread.currentThread().isInterrupted()) {
        readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setName("CrnReader-" + deviceConfig.getDeviceNo());
                t.setDaemon(true);
                return t;
            }
        });
        readExecutor.scheduleAtFixedRate(() -> {
            if (closed || Thread.currentThread().isInterrupted()) {
                return;
            }
            try {
                deviceLogCollectTime = Utils.getDeviceLogCollectTime();
                readStatus();
            } catch (Exception e) {
                log.error("CrnThread Fail", e);
            }
        }, 0, 200, TimeUnit.MILLISECONDS);
        processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setName("CrnWriter-" + deviceConfig.getDeviceNo());
                t.setDaemon(true);
                return t;
            }
        });
        processExecutor.scheduleAtFixedRate(() -> {
            if (closed || Thread.currentThread().isInterrupted()) {
                return;
            }
            try {
                int step = 1;
                Task task = MessageQueue.poll(SlaveType.Crn, deviceConfig.getDeviceNo());
                if (task != null) {
                    step = task.getStep();
                }
                switch (step) {
                    case 1:
                        readStatus();
                        break;
                    case 2:
                        sendCommand((CrnCommand) task.getData());
                        break;
                    default:
                        break;
                if (step == 2 && task != null) {
                    sendCommand((CrnCommand) task.getData());
                }
                Thread.sleep(200);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        }, 0, 200, TimeUnit.MILLISECONDS);
    }
    /**
@@ -217,9 +241,13 @@
    @Override
    public void close() {
        closed = true;
        Thread t = mainThread;
        if (t != null) {
            try { t.interrupt(); } catch (Exception ignore) {}
        ScheduledExecutorService ex = readExecutor;
        if (ex != null) {
            try { ex.shutdownNow(); } catch (Exception ignore) {}
        }
        ScheduledExecutorService px = processExecutor;
        if (px != null) {
            try { px.shutdownNow(); } catch (Exception ignore) {}
        }
        if (zyCrnConnectDriver != null) {
            zyCrnConnectDriver.close();
src/main/java/com/zy/core/thread/impl/ZyStationThread.java
@@ -28,6 +28,10 @@
import java.text.MessageFormat;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
@@ -46,8 +50,8 @@
    private int deviceLogCollectTime = 200;
    private long deviceDataLogTime = System.currentTimeMillis();
    private volatile boolean closed = false;
    private Thread mainThread;
    private Thread readThread;
    private ScheduledExecutorService readExecutor;
    private ScheduledExecutorService processExecutor;
    public ZyStationThread(DeviceConfig deviceConfig, RedisUtil redisUtil) {
        this.deviceConfig = deviceConfig;
@@ -59,45 +63,54 @@
    public void run() {
        this.connect();
        deviceLogCollectTime = Utils.getDeviceLogCollectTime();
        mainThread = Thread.currentThread();
        readThread = new Thread(() -> {
            while (!closed && !Thread.currentThread().isInterrupted()) {
                try {
                    readStatus();
                    Thread.sleep(200);
                } catch (InterruptedException ie) {
                    Thread.currentThread().interrupt();
                    break;
                } catch (Exception e) {
                    log.error("StationThread Fail", e);
                }
        readExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setName("DevpReader-" + deviceConfig.getDeviceNo());
                t.setDaemon(true);
                return t;
            }
        });
        readThread.start();
        readExecutor.scheduleAtFixedRate(() -> {
            if (closed || Thread.currentThread().isInterrupted()) {
                return;
            }
            try {
                deviceLogCollectTime = Utils.getDeviceLogCollectTime();
                readStatus();
            } catch (Exception e) {
                log.error("StationThread Fail", e);
            }
        }, 0, 200, TimeUnit.MILLISECONDS);
        while (!closed && !Thread.currentThread().isInterrupted()) {
        processExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                Thread t = new Thread(r);
                t.setName("DevpWriter-" + deviceConfig.getDeviceNo());
                t.setDaemon(true);
                return t;
            }
        });
        processExecutor.scheduleAtFixedRate(() -> {
            if (closed || Thread.currentThread().isInterrupted()) {
                return;
            }
            try {
                int step = 1;
                Task task = MessageQueue.poll(SlaveType.Devp, deviceConfig.getDeviceNo());
                if (task != null) {
                    step = task.getStep();
                }
                switch (step) {
                    case 2:
                        sendCommand((StationCommand) task.getData());
                        break;
                    default:
                        break;
                if (step == 2 && task != null) {
                    sendCommand((StationCommand) task.getData());
                }
                Thread.sleep(200);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        }, 0, 200, TimeUnit.MILLISECONDS);
    }
    private void readStatus() {
@@ -177,13 +190,13 @@
    @Override
    public void close() {
        closed = true;
        Thread t = mainThread;
        if (t != null) {
            try { t.interrupt(); } catch (Exception ignore) {}
        ScheduledExecutorService ex = readExecutor;
        if (ex != null) {
            try { ex.shutdownNow(); } catch (Exception ignore) {}
        }
        Thread rt = readThread;
        if (rt != null) {
            try { rt.interrupt(); } catch (Exception ignore) {}
        ScheduledExecutorService px = processExecutor;
        if (px != null) {
            try { px.shutdownNow(); } catch (Exception ignore) {}
        }
        if (zyStationConnectDriver != null) {
            zyStationConnectDriver.close();
src/main/resources/application.yml
@@ -2,6 +2,7 @@
  port: 9090
  servlet:
    context-path: /@pom.build.finalName@
  shutdown: graceful
spring:
  application:
@@ -25,6 +26,15 @@
    scheduling:
      pool:
        size: 3
      shutdown:
        await-termination: true
        await-termination-period: 30s
    execution:
      shutdown:
        await-termination: true
        await-termination-period: 30s
  lifecycle:
    timeout-per-shutdown-phase: 20s
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
@@ -76,4 +86,4 @@
  model: deepseek-ai/DeepSeek-V3.2
#  base-url: http://34.2.134.223:3000/v1
#  api-key: sk-WabrmtOezCFwVo7XvVOrO3QkmfcKG7T7jy0BaVnmQTWm5GXh
#  model: gemini-3-pro-preview
#  model: gemini-3-pro-preview