package com.java110.front.listener; import com.java110.front.core.PackageScanner; import com.java110.front.core.VueComponentTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.util.StringUtils; import java.io.*; import java.util.HashMap; import java.util.Map; public class ReloadComponentFileListener extends PackageScanner implements Runnable { private Logger logger = LoggerFactory.getLogger(ReloadComponentFileListener.class); /** * 默认扫描组件路径 */ private static final String DEFAULT_COMPONENT_PACKAGE_PATH = "components"; /** * js 文件 */ public static final String COMPONENT_JS = "js"; /** * css 文件 */ public static final String COMPONENT_CSS = "css"; /** * html 文件 */ public static final String COMPONENT_HTML = "html"; private static final Map commentInfo = new HashMap(); /** * 心跳加载组件信息 标志 true 为定时加载组件信息 */ private static boolean RELOAD_COMPONENT_FLAG = false; /** * 心跳时间,默认为5秒 */ private static long HEARTBEAT_TIME = 5 * 1000; public ReloadComponentFileListener() { } public ReloadComponentFileListener(boolean flag) { RELOAD_COMPONENT_FLAG = flag; } public ReloadComponentFileListener(boolean flag, long time) { RELOAD_COMPONENT_FLAG = flag; HEARTBEAT_TIME = time; } @Override public void run() { while (RELOAD_COMPONENT_FLAG) { try { reloadComponent(); Thread.sleep(HEARTBEAT_TIME);//线程休息 } catch (Throwable e) { logger.error("加载组件失败:", e); } } } private void reloadComponent() { logger.debug("开始扫描是否有组件添加或修改"); VueComponentTemplate vueComponentTemplate = new VueComponentTemplate(); vueComponentTemplate.packageScanner(DEFAULT_COMPONENT_PACKAGE_PATH, COMPONENT_JS); vueComponentTemplate.packageScanner(DEFAULT_COMPONENT_PACKAGE_PATH, COMPONENT_HTML); vueComponentTemplate.packageScanner(DEFAULT_COMPONENT_PACKAGE_PATH, COMPONENT_CSS); logger.debug("扫描完成是否有组件添加或修改"); } @Override protected void handleResource(String filePath) { File componentFile = new File(filePath); Long lastModified = componentFile.lastModified(); if(!commentInfo.containsKey(componentFile.getName())){ commentInfo.put(componentFile.getName(), lastModified); reloadComponentContext(filePath); } Long prevModified = commentInfo.get(componentFile.getName()); if (lastModified > prevModified) { reloadComponentContext(filePath); commentInfo.put(componentFile.getName(), lastModified); } } private void reloadComponentContext(String filePath){ Reader reader = null; String sb = ""; try { InputStream inputStream = new ClassPathResource(filePath).getInputStream(); //InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(File.separator + filePath); reader = new InputStreamReader(inputStream, "UTF-8"); int tempChar; StringBuffer b = new StringBuffer(); while ((tempChar = reader.read()) != -1) { b.append((char) tempChar); } sb = b.toString(); if (StringUtils.isEmpty(sb)) { return; } String componentKey = ""; //这里在window 读取jar包中文件时,也是 / 但是直接启动时 为\这个 所以不能用 File.separator if (filePath.contains("/")) { componentKey = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length()); } else { componentKey = filePath.substring(filePath.lastIndexOf("\\") + 1, filePath.length()); } VueComponentTemplate.refreshComponent(componentKey, sb); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } }