JPress技术精讲:JPress如何做到安装后重新加载的?
JFinal应用实战视频教程:http://www.roncoo.com/course/view/a44d3a2e82614a9e95497af07065ce71
JPress安装完成后,如何能重新加载?
简单回答下:
1、jetty模式下,JFinal会自动指定检查WebRoot目录,如果有发生变化,会自动重新加载。
2、tomcat容器下,可以通过tomcat的相关配置,让tomcat监控相应的文件,如果发生变化会自动重新加载。
下面简要通过代码来看下JFinal在jetty模式下如何做到重新加载的。
玩过JFinla的人都知道,JFinal有一个start方法,通过start方法来启动jetty服务,方便开发调试。代码如下:
public static void start(int port) { JFinal.start("WebRoot", 8080, "/", 5); }
通过JFinal.start方法,传入相关的配置,即可启动jetty。
JFinal的start方法也非常简单,代码如下:
public final class JFinal { //....此处省略 public static void start() { server = ServerFactory.getServer(); server.start(); } //....此处省略}
通过ServerFactory.getServer()获取一个Server,然后启动Server。这里获取的Server是一个jettyServer。代码如下:
class JettyServer implements IServer { // ...此处省略 public void start() { if (!running) { try {doStart();} catch (Exception e) {LogKit.error(e.getMessage(), e);} running = true; } } private void doStart() { // ...此处省略 Scanner scanner = new Scanner(PathKit.getRootClassPath(), scanIntervalSeconds) { public void onChange() { try { System.err.println("\nLoading changes ......"); webApp.stop(); JFinalClassLoader loader = new JFinalClassLoader(webApp, getClassPath()); webApp.setClassLoader(loader); webApp.start(); System.err.println("Loading complete."); } catch (Exception e) { System.err.println("Error reconfiguring/restarting webapp after change in watched files"); LogKit.error(e.getMessage(), e); } } }; scanner.start(); } // ...此处省略 } // ...此处省略}
当Server调用start方法后,start方法会调用doStart()方法,doStart()里面创建了一个扫描器Scanner,传入一个匿名内部类,实现监听onChange监听,并调用Scanner.start()启动Scanner。
Scanner的简要代码如下:
public abstract class Scanner { public void start() { if (!running) { timer = new Timer("JFinal-Scanner", true); task = new TimerTask() {public void run() {working();}}; timer.schedule(task, 1010L * interval, 1010L * interval); running = true; } } private void working() { scan(rootDir); compare(); preScan.clear(); preScan.putAll(curScan); curScan.clear(); } private void scan(File file) { if (file == null || !file.exists()) return ; if (file.isFile()) { try { curScan.put(file.getCanonicalPath(), new TimeSize(file.lastModified(),file.length())); } catch (IOException e) { LogKit.error(e.getMessage(), e); } } else if (file.isDirectory()) { File[] fs = file.listFiles(); if (fs != null) for (File f : fs) scan(f); } } private void compare() { if (preScan.size() == 0) return; if (!preScan.equals(curScan)) onChange(); } }
当Scanner的start方法被调用的时候,会启动一个定时器执行working()方法,working()方法内部只做两件事情。
1、通过scan方法扫描文件,并把文件的最后修改时间添加到curScan这个map里面去。
2、通过compare方法来判断刚刚扫描的额这个map和之前已经的map是否相同,如果不相同就调用onChange()方法。
刚才我们在JettyServer传入了一个匿名内部类,并实现了onChange()方法了,因此,Scanner调用onChange其实就是调用了JettyServer传入的这个匿名内部类的onChange()。
再回头来看一下匿名内部类的onChange()的实现:
Scanner scanner = new Scanner(PathKit.getRootClassPath(), scanIntervalSeconds) { public void onChange() { try { System.err.println("\nLoading changes ......"); webApp.stop(); JFinalClassLoader loader = new JFinalClassLoader(webApp, getClassPath()); webApp.setClassLoader(loader); webApp.start(); System.err.println("Loading complete."); } catch (Exception e) { System.err.println("Error reconfiguring/restarting webapp after change in watched files"); LogKit.error(e.getMessage(), e); } } };
在这里,我们能够很明显的看到,通过webApp.stop方法停止了web服务,然后又通过start()方法启动了web服务。
到此,Jetty环境下讲解完毕。我们也得到了这么一个结论:只要RootClassPath下有文件发生变化,就会造成jetty重新加载,JPress也是利用了JFinal的这个特性,安装完毕后会在ClassPath下创建db.properties文件,发生了文件变化,从而让Jetty达到重新加载的目的。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2016 年度码云热门项目排行榜 TOP 50
2016 年度码云热门项目排行榜 TOP 50 是通过开源项目2016年在码云上的 Watch、Star、Fork 数量来评定的榜单。码云平台发展至今,涌现了越来越多优秀的开源项目,越来越多的开源作者在上面分享自己的作品。我们希望通过此榜单在回顾总结2016年国内开源趋势,了解开源作者现状的同时,也能便于大家更好地找到自己需要的项目。 1、JFinal 简介: JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有 Java 语言所有优势的同时再拥有 ruby、python、php 等动态语言的开发效率。 作者:@JFinal 地址:http://git.oschina.net/jfinal/jfinal 2、iBase4J 简介: iBase4J 是 Java 语言的分布式系统架构。 使用 Spring 整合开源框架,包括 SpringMVC、Mybatis、mybatis-plus、dubbo扩展、Redis缓存、单点登录、shiro权限管理、分布式集群调度、Rest、工具...
- 下一篇
Java处理高并发高负载类网站的优化方法
一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0的应用,数据库的响应是首先要解决的。 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降。常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作。我推荐的是M-M-Slaves方式,2个主Mysql,多个Slaves,需要注意的是,虽然有2个Master,但是同时只有1个是Active,我们可以在一定时候切换。之所以用2个M,是保证M不会又成为系统的SPOF。 Slaves可以进一步负载均衡,可以结合LVS,从而将select操作适当的平衡到不同的slaves上。以上架构可以抗衡到一定量的负载,但是随着用户进一步增加,你的用户表数据超过1千万,这时那个M变成了SPOF。你不能任意扩充Slaves,否则复制同步的开销将直线上升,怎么办?我的方法是表分区,从业务层面上进行分区。最简单的,以用户数据为例。根据一定的切分方式,比如id,切分到不同的数据库集群去。 全局数...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G