From 84425b2a95b91ba2632aeb5d93b603e1e4ab2094 Mon Sep 17 00:00:00 2001 From: lyh <925863403@qq.com> Date: 星期二, 10 六月 2025 13:56:07 +0800 Subject: [PATCH] 监听文件 --- lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml | 14 + lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java | 10 + lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java | 22 +++ lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java | 53 ++++++++ lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java | 66 +++++++++++ lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java | 19 +++ lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java | 115 +++++++++++++++++++ lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java | 14 ++ 8 files changed, 306 insertions(+), 7 deletions(-) diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/DirectoryValidator.java new file mode 100644 index 0000000..d81e2ea --- /dev/null +++ b/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); + } + } + } +} diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileListener.java new file mode 100644 index 0000000..59eb0af --- /dev/null +++ b/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鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽 + if (filePath.startsWith("D:\\hy_test\\ncFile")) { + handleIndustrialDocFile(file); + } + }else { + //娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽锛堢▼搴忓洖浼狅級 + 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鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽 + * @param file + */ + private void handleIndustrialDocFile(File file) { + log.info("宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", 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 鏄惁瑙f瀽宸ヤ綔娴佹搷浣� + + } + } catch (Exception e) { + log.error("宸ユ帶缃戣В鏋愭秹瀵嗙綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", e.getMessage()); + } + } + + /** + * 娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽锛堢▼搴忓洖浼狅級 + * @param file + */ + private void handleSecretDocFile(File file) { + log.info("娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", file.getAbsolutePath()); + try { + boolean b= docInfoService.addDocInfoAnalysisSmwNcService(file.getAbsolutePath(), file); + + }catch (Exception e) { + log.error("娑夊瘑缃戣В鏋愬伐鎺х綉浼犺繃鏉ョ殑NC鏂囦欢涓巒c鏂囦欢杩涜瑙f瀽: {}", e.getMessage()); + } + } + + +} diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorBootstrap.java new file mode 100644 index 0000000..e6b3d86 --- /dev/null +++ b/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()); + } + } + }); + }; + } +} diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/FileMonitorConfig.java new file mode 100644 index 0000000..8be5968 --- /dev/null +++ b/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绉� + +} diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/listener/MultiPathMonitor.java new file mode 100644 index 0000000..267dfc8 --- /dev/null +++ b/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); + } +} diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java index 01cd044..15990e5 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java +++ b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/IDocInfoService.java @@ -49,11 +49,17 @@ boolean addDocInfoRec(String pathFile,File fileRec); /** - * 瑙f瀽NC鏂囨。閫氱敤鏂规硶 + * 瑙f瀽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); /** * 鏂囨。瑙f瀽 diff --git a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java b/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java index f31c8d0..a32370c 100644 --- a/lxzn-module-dnc/src/main/java/org/jeecg/modules/dnc/service/impl/DocInfoServiceImpl.java +++ b/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 ) { diff --git a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml index d79ea82..5b27cd5 100644 --- a/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml +++ b/lxzn-module-system/lxzn-system-start/src/main/resources/application-dev.yml @@ -311,7 +311,13 @@ deploy: #宸ユ帶缃�/娑夊瘑缃戦儴缃� 0涓烘秹瀵嗙綉 1涓哄伐鎺х綉 deployType: 0 - #娑夊瘑缃戜紶杈搉c鏂囦欢澶� - secretFolder: D:\\hy_test\\a - #宸ユ帶缃戠洃鎺c鏂囦欢澶� - workFolder: D:\\hy_test\\b + #娑夊瘑缃戜紶杈撳伐鎺х綉nc鏂囦欢澶�(鎸囨淳璁惧nc鏂囦欢) 宸ユ帶缃戜紶杈撴秹瀵嗙綉nc鏂囦欢澶�(瑙f瀽鍥炰紶鍚庣殑nc鏂囦欢) + secretFolder: D:\\test\\a +file: + monitor: + # 涓変釜鐩戞帶鐩綍閰嶇疆 + paths: + - D:\\hy_test\\ncFile #宸ユ帶璐熻矗瑙f瀽閲岄潰鐨勬枃浠�;娑夊瘑缃戣繘琛岃В鏋愬洖浼犵殑鎿嶄綔 + - D:\\hy_test\\b + - D:\\hy_test\\c + interval: 10000 # 鐩戞帶闂撮殧(ms) -- Gitblit v1.9.3