2018-06-26 10:22:01 574浏览
这种方式仅适合于比较小的项目,例如只有一两台服务器,而且配置文件是可以直接修改的。例如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();
}
}
}
}
}
【关注微信公众号获取更多学习资料】