欢迎来到天天文库
浏览记录
ID:41127328
大小:21.36 KB
页数:4页
时间:2019-08-17
《java培训(Play Framework hotswap及源码分析)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、PlayFrameworkhotswap及源码分析reachyourmaximumproductivity。play!允许开发人员修改java文件,保存,然后刷新浏览器,立马可以看到效果。不需要编译,也不需要重启服务器。play!最大的卖点就在于hotswap,正如它自己宣称的:reachyourmaximumproductivity。play!允许开发人员修改java文件,保存,然后刷新浏览器,立马可以看到效果。不需要编译,也不需要重启服务器。Java要想实现动态更新class文件,不外乎两种手段:替换classloader、替换JVM。因
2、为替换JVM引起的开销更大,需要维护JVM的堆、栈等运行信息,所以hotswap通常是选择替换classloader。比如grails里面就是选择替换classloader,它会自己维护一个线程,定期轮询源文件是否发生修改,以替换原来的classloader。那么play!宣称的hotswap又是怎么实现的呢?让我们来看看play!的内部流程:1.play!使用了ApacheMina作为底层的httpserver,然后使用了自己关于MinaIoHandler接口的实现——HttpHandler2.当浏览器发起一个request:2.1Mina
3、Server生成一个MinaRequest,转发给HttpHandler的messageReceived方法2.2play!解析MinaRequest和MinaSession,包装成自己的Request对象1.Request request = parseRequest(minaRequest, session); 2.3play!检测Route文件修改情况,根据Route配置信息将Route/Action的信息赋给Request对象1.Router.detectChanges(); 2.Router.route(request); 2.4p
4、lay!根据当前配置的开发模式来采用不同的策略调用Action来理Request1.if (Play.mode == Play.Mode.DEV) { 2.Invoker.invokeInThread(new MinaInvocation(session, minaRequest, minaResponse, request, response)); 3.} else { 1.Invoker.invoke(new MinaInvocation(session, minaRequest, minaResponse, request, respo
5、nse)); 2.} 2.5如果play!当前是DEV模式,invokeInThread方法会让invocation对象代理run()方法1.public void run() { 2.try { 3.before(); 4.execute(); 5.after(); 6.} catch (Throwable e) { 7.onException(e); 8.} finally { 9._finally(); 10.} 11.} 咱们来看看before()方法:1.public static void before() { 2.Thread.
6、currentThread().setContextClassLoader(Play.classloader); 3.if(!Play.id.equals("test")) { 4.Play.detectChanges(); 5.if (!Play.started) { 6.Play.start(); 7.} 8.} 9.// 10.} 在Play类的detectChanges()方法里面,有这么一句:1.classloader.detectChanges(); 哈哈,play!修改源文件后,刷新浏览器即见效的奥秘就在这里了。再进去看看pla
7、y!自定义classloader的detectChanges()方法:1.public void detectChanges() { 2.// Now check for file modification 3.List modifieds = new ArrayList(); 4.for (ApplicationClass applicationClass : Play.classes.all()) { 1.if (applicationClass.timestamp
8、< applicationClass.javaFile.lastModified()) { 2.applicationClass.refresh(); 3.modi
此文档下载收益归作者所有