2018-06-26 10:22:01 548浏览
这种方式仅适合于比较小的项目,例如只有一两台服务器,而且配置文件是可以直接修改的。例如Springmvc以war包的形式部署,可以直接修改resources中的配置文件。如果是Springboot项目,还想用这种方式的话,就要引用一个外部可以编辑的文件,比如一个固定的目录,因为springboot大多数以jar包部署,打到包里的配置文件没办法直接修改。如果是比较大的项目,最好还是用配置中心,例如携程的Apollo、Consul等。
原始方式
原始方式指的是每次要修改配置的时候,都要重新打包发布或者重启服务器。
@Repository public class ConfigWatcher { private static final Logger logger = LoggerFactory.getLogger(ConfigWatcher.class); private static WatchService watchService; @PostConstruct public void init() { logger.info("启动配置文件监控器"); try { watchService = FileSystems.getDefault().newWatchService(); URL url = ConfigWatcher.class.getResource("/"); Path path = Paths.get(url.toURI()); path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE); } catch (Exception e1) { e1.printStackTrace(); } /** * 启动监控线程 */ Thread watchThread = new Thread(new WatchThread()); watchThread.setDaemon(true); watchThread.start(); /**注册关闭钩子*/ Thread hook = new Thread(new Runnable() { @Override public void run() { try { watchService.close(); } catch (IOException e) { e.printStackTrace(); } } }); Runtime.getRuntime().addShutdownHook(hook); } public class WatchThread implements Runnable { @Override public void run() { while (true) { try { // 尝试获取监控池的变化,如果没有则一直等待 WatchKey watchKey = watchService.take(); for (WatchEvent<?> event : watchKey.pollEvents()) { String editFileName = event.context().toString(); logger.info(editFileName); /** * 重新加载配置 */ } watchKey.reset();//完成一次监控就需要重置监控器一次 } catch (Exception e) { e.printStackTrace(); } } } } }
【关注微信公众号获取更多学习资料】