热加载
- 热加载指的是当一个web项目的classes目录下的资源发生了变化,或者 lib 里的 jar 发生了变化,那么就会重新加载当前 Context, 那么就不需要重新启动 Tomcat 也能观察到 class 修改之后的效果。
监听
-
上面的逻辑中需要对Context对应的内容文件进行监听,使用Watcher类来实现
-
public class ContextFileChangeWatcher { private WatchMonitor monitor; private boolean stop = false; public ContextFileChangeWatcher(Context context) { this.monitor = WatchUtil.createAll(context.getDocBase(), Integer.MAX_VALUE, new Watcher() { private void dealWith(WatchEvent<?> event) { synchronized (ContextFileChangeWatcher.class) { String fileName = event.context().toString(); if (stop) return; if (fileName.endsWith(".jar") || fileName.endsWith(".class") || fileName.endsWith(".xml")) { stop = true; LogFactory.get().info(ContextFileChangeWatcher.this + " 检测到了Web应用下的重要文件变化 {} " , fileName); context.reload(); } } } @Override public void onCreate(WatchEvent<?> event, Path currentPath) { dealWith(event); } @Override public void onModify(WatchEvent<?> event, Path currentPath) { dealWith(event); } @Override public void onDelete(WatchEvent<?> event, Path currentPath) { dealWith(event); } @Override public void onOverflow(WatchEvent<?> event, Path currentPath) { dealWith(event); } }); this.monitor.setDaemon(true); } public void start() { monitor.start(); } public void stop() { monitor.close(); } }
Context
-
当Context对应的文件内容发生变化时,watcher进行检测,当检测到变化,调用context对象的reload方法进行重载,context的重载是通过父对象Host进行的。
-
public void reload(){ host.reload(this); }