lyh
2025-06-10 84425b2a95b91ba2632aeb5d93b603e1e4ab2094
监听文件
已添加5个文件
已修改3个文件
313 ■■■■■ 文件已修改
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package org.jeecg.modules.dnc.listener;
import java.io.File;
import java.util.List;
public class DirectoryValidator {
    public static void validatePaths(List<String> paths) {
        //根据配置的目录进行校验,可以修改yml文件对应的监控目录来改变校验数量
        if (paths == null || paths.size() < 3) {
            throw new IllegalArgumentException("必须配置三个监控目录");
        }
        for (String path : paths) {
            File dir = new File(path);
            if (!dir.exists() || !dir.isDirectory()) {
                throw new IllegalArgumentException("无效的监控目录: " + path);
            }
            if (!dir.canRead()) {
                throw new SecurityException("目录不可读: " + path);
            }
        }
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package org.jeecg.modules.dnc.listener;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.jeecg.common.util.FileUtil;
import org.jeecg.modules.dnc.service.IDocInfoService;
import org.jeecg.modules.dnc.utils.file.FileUtilS;
import org.jeecg.modules.message.enums.DeployEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.Objects;
@Component
public class FileListener implements FileAlterationListener {
    private static final Logger log = LoggerFactory.getLogger(FileListener.class);
    @Value("${deploy.deployType}")
    private String deployType;    //工控网/涉密网部署 0为工控网 1为涉密网
    @Autowired
    private IDocInfoService docInfoService;  // æ–‡æ¡£æœåŠ¡
    @Override
    public void onStart(FileAlterationObserver observer) {
        log.info("开始监听目录: {}", observer.getDirectory().getAbsolutePath());
    }
    @Override
    public void onDirectoryCreate(File directory) {
        log.info("[目录创建]: {}", directory.getAbsolutePath());
    }
    @Override
    public void onDirectoryChange(File directory) {
        log.info("[目录修改]: {}", directory.getAbsolutePath());
    }
    @Override
    public void onDirectoryDelete(File directory) {
        log.info("[目录删除]: {}", directory.getAbsolutePath());
    }
    @Override
    public void onFileCreate(File file) {
        String filePath = file.getAbsolutePath();
        log.info("[新建]: {}", filePath);
        if (DeployEnum.GW.getCode().equals(deployType)) {
            //工控网解析涉密网传过来的NC文件与nc文件进行解析
            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
                handleIndustrialDocFile(file);
            }
        }else {
            //涉密网解析工控网传过来的NC文件与nc文件进行解析(程序回传)
            if (filePath.startsWith("D:\\hy_test\\ncFile")) {
                handleSecretDocFile(file);
            }
        }
    }
    @Override
    public void onFileChange(File file) {
        log.info("[修改]: {}", file.getAbsolutePath());
    }
    @Override
    public void onFileDelete(File file) {
        log.info("[删除]: {}", file.getAbsolutePath());
    }
    @Override
    public void onStop(FileAlterationObserver observer) {
        log.info("结束监听目录: {}", observer.getDirectory().getAbsolutePath());
    }
    /**
     * å·¥æŽ§ç½‘解析涉密网传过来的NC文件与nc文件进行解析
     * @param file
     */
    private void handleIndustrialDocFile(File file) {
        log.info("工控网解析涉密网传过来的NC文件与nc文件进行解析: {}", file.getAbsolutePath());
        try {
            if (Objects.equals(FileUtil.getFileSuffix(file.getName()), "nc")) {
                boolean success = docInfoService.addDocInfoAnalysisGwNcService(file.getAbsolutePath(), file);
                if (success) {
                    FileUtilS.copyFileRec(file.getAbsolutePath());
                    FileUtilS.fileRecDelete(file.getAbsolutePath());
                }
            }else if (Objects.equals(FileUtil.getFileSuffix(file.getName()), "txt")) {
                //todo æ˜¯å¦è§£æžå·¥ä½œæµæ“ä½œ
            }
        } catch (Exception e) {
            log.error("工控网解析涉密网传过来的NC文件与nc文件进行解析: {}", e.getMessage());
        }
    }
    /**
     * æ¶‰å¯†ç½‘解析工控网传过来的NC文件与nc文件进行解析(程序回传)
     * @param file
     */
    private void handleSecretDocFile(File file) {
        log.info("涉密网解析工控网传过来的NC文件与nc文件进行解析: {}", file.getAbsolutePath());
        try {
            boolean b= docInfoService.addDocInfoAnalysisSmwNcService(file.getAbsolutePath(), file);
        }catch (Exception e) {
            log.error("涉密网解析工控网传过来的NC文件与nc文件进行解析: {}", e.getMessage());
        }
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package org.jeecg.modules.dnc.listener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FileMonitorBootstrap implements ApplicationRunner {
    private MultiPathMonitor monitor;
    @Autowired
    private FileMonitorConfig config;
    @Autowired
    private FileListener listener;
    @Bean
    public MultiPathMonitor fileMonitor() {
        return new MultiPathMonitor(
                config.getPaths(),
                config.getInterval(),
                listener
        );
    }
    @Override
    public void run(ApplicationArguments args) throws Exception {
        monitor = fileMonitor();
        monitor.start();
    }
    // åœ¨åº”用关闭时停止监控
    @Bean
    public ServletContextInitializer stopMonitorOnShutdown() {
        return servletContext -> {
            servletContext.addListener(new javax.servlet.ServletContextListener() {
                @Override
                public void contextDestroyed(javax.servlet.ServletContextEvent sce) {
                    try {
                        if (monitor != null) {
                            monitor.stop();
                        }
                    } catch (Exception e) {
                        System.err.println("停止监控时出错: " + e.getMessage());
                    }
                }
            });
        };
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package org.jeecg.modules.dnc.listener;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "file.monitor")
public class FileMonitorConfig {
    private List<String> paths = new ArrayList<>();
    private long interval = 10000L; // é»˜è®¤10秒
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package org.jeecg.modules.dnc.listener;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.List;
public class MultiPathMonitor {
    private static final Logger log = LoggerFactory.getLogger(MultiPathMonitor.class);
    private final List<String> paths;
    private final FileListener listener;
    private final long interval;
    private final FileAlterationMonitor monitor;
    public MultiPathMonitor(List<String> paths, long interval, FileListener listener) {
        // éªŒè¯ç›®å½•
        DirectoryValidator.validatePaths(paths);
        this.paths = paths;
        this.interval = interval;
        this.listener = listener;
        this.monitor = new FileAlterationMonitor(interval);
    }
    public void start() {
        // ä¸ºæ¯ä¸ªè·¯å¾„创建独立的观察者
        paths.forEach(path -> {
            FileAlterationObserver observer = new FileAlterationObserver(new File(path));
            observer.addListener(listener);
            monitor.addObserver(observer);
            log.info("开始监控目录: {}", path);
        });
        try {
            monitor.start();
            log.info("文件监控器已启动,监控目录数量: {}", paths.size());
        } catch (Exception e) {
            log.error("监控启动失败", e);
            throw new RuntimeException("监控启动失败", e);
        }
    }
    public void stop() throws Exception {
        if (monitor != null) {
            monitor.stop();
            log.info("文件监控器已停止");
        }
    }
    // åŠ¨æ€æ·»åŠ æ–°ç›®å½•
    public void addMonitorPath(String newPath) {
        File dir = new File(newPath);
        if (!dir.exists() || !dir.isDirectory() || !dir.canRead()) {
            log.error("无法添加无效目录: {}", newPath);
            return;
        }
        FileAlterationObserver newObserver = new FileAlterationObserver(dir);
        newObserver.addListener(listener);
        monitor.addObserver(newObserver);
        paths.add(newPath);
        log.info("新增监控目录: {}", newPath);
    }
}
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java
@@ -49,11 +49,17 @@
    boolean addDocInfoRec(String pathFile,File fileRec);
    /**
     * è§£æžNC文档通用方法
     * è§£æžNC文档通用方法(工控解析涉密)
     * @param pathFile,fileRec
     * @return
     */
    boolean addDocInfoAnalysisNcService(String pathFile,File fileRec) throws FileNotFoundException;
    boolean addDocInfoAnalysisGwNcService(String pathFile,File fileRec) throws FileNotFoundException;
    /**
     * ç¨‹åºå›žä¼ ï¼ˆæ¶‰å¯†è§£æžå·¥æŽ§ï¼‰
     * @param pathFile
     */
    boolean addDocInfoAnalysisSmwNcService(String pathFile,File fileRec);
    /**
     * æ–‡æ¡£è§£æž
lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java
@@ -275,7 +275,7 @@
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean addDocInfoAnalysisNcService(String pathFile,File file) throws FileNotFoundException {
    public boolean addDocInfoAnalysisGwNcService(String pathFile,File file) throws FileNotFoundException {
        String line;
        int count = 0;
        String loFilePath = config.getPaths().get(0)+"/" + file.getName();
@@ -334,6 +334,18 @@
        return true;
    }
    /**
     * ç¨‹åºå›žä¼ ï¼ˆæ¶‰å¯†è§£æžå·¥æŽ§ï¼‰
     * @param pathFile
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean addDocInfoAnalysisSmwNcService(String pathFile,File fileRec){
        //todo ç¨‹åºå›žä¼ 
        return true;
    }
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean addDocInfoRecService(String equipmentId,File fileRec,String fileNameSuffix,String fileNameNew,String filePath ) {
lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml
@@ -311,7 +311,13 @@
deploy:
    #工控网/涉密网部署 0为涉密网 1为工控网
    deployType: 0
    #涉密网传输nc文件夹
    secretFolder: D:\\hy_test\\a
    #工控网监控nc文件夹
    workFolder: D:\\hy_test\\b
    #涉密网传输工控网nc文件夹(指派设备nc文件)    å·¥æŽ§ç½‘传输涉密网nc文件夹(解析回传后的nc文件)
    secretFolder: D:\\test\\a
file:
  monitor:
    # ä¸‰ä¸ªç›‘控目录配置
    paths:
      - D:\\hy_test\\ncFile #工控负责解析里面的文件;涉密网进行解析回传的操作
      - D:\\hy_test\\b
      - D:\\hy_test\\c
    interval: 10000  # ç›‘控间隔(ms)