java培训-Play Framework hotswap及源码分析.docx_第1页
java培训-Play Framework hotswap及源码分析.docx_第2页
java培训-Play Framework hotswap及源码分析.docx_第3页
java培训-Play Framework hotswap及源码分析.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Play Framework hotswap及源码分析reach your maximum productivity。play! 允许开发人员修改java文件,保存,然后刷新浏览器,立马可以看到效果。不需要编译,也不需要重启服务器。play! 最大的卖点就在于 hot swap,正如它自己宣称的:reach your maximum productivity。play! 允许开发人员修改java文件,保存,然后刷新浏览器,立马可以看到效果。不需要编译,也不需要重启服务器。Java 要想实现动态更新 class 文件,不外乎两种手段:替换 classloader、替换 JVM。因为替换 JVM 引起的开销更大,需要维护 JVM 的堆、栈等运行信息,所以 hot swap 通常是选择替换 classloader。比如 grails 里面就是选择替换 classloader,它会自己维护一个线程,定期轮询源文件是否发生修改,以替换原来的 classloader。那么 play! 宣称的 hot swap 又是怎么实现的呢?让我们来看看play! 的内部流程:1. play! 使用了 Apache Mina 作为底层的 http server,然后使用了自己关于 Mina IoHandler 接口的实现 HttpHandler2. 当浏览器发起一个 request:2.1 Mina Server 生成一个 Mina Request,转发给 HttpHandler 的 messageReceived 方法2.2 play! 解析 Mina Request 和 Mina Session,包装成自己的 Request 对象1. Requestrequest=parseRequest(minaRequest,session); 2.3 play! 检测 Route 文件修改情况,根据 Route 配置信息将 Route/Action 的信息赋给 Request 对象1. Router.detectChanges(); 2. Router.route(request); 2.4 play! 根据当前配置的开发模式来采用不同的策略调用 Action 来理 Request1. if(Play.mode=Play.Mode.DEV) 2. Invoker.invokeInThread(newMinaInvocation(session,minaRequest,minaResponse,request,response); 3. else 4. Invoker.invoke(newMinaInvocation(session,minaRequest,minaResponse,request,response); 5. 2.5 如果 play! 当前是 DEV 模式,invokeInThread方法会让 invocation 对象代理 run() 方法1. publicvoidrun() 2. try 3. before(); 4. execute(); 5. after(); 6. catch(Throwablee) 7. onException(e); 8. finally 9. _finally(); 10. 11. 咱们来看看 before() 方法:1. publicstaticvoidbefore() 2. Thread.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! 修改源文件后,刷新浏览器即见效的奥秘就在这里了。再进去看看 play! 自定义 classloader 的 detectChanges() 方法:1. publicvoiddetectChanges() 2. /Nowcheckforfilemodification 3. Listmodifieds=newArrayList(); 4. for(ApplicationClassapplicationClass:Play.classes.all() 5. if(applicationClass.timestampapplicationClass.javaFile.lastModified() 6. applicationClass.refresh(); 7. modifieds.add(applicationClass); 8. 9. 10. ListnewDefinitions=newArrayList(); 11. MapannotationsHashes=newHashMap(); 12. for(ApplicationClassapplicationClass:modifieds) 13. annotationsHashes.put(applicationClass.javaClass,computeAnnotationsHash(applicationClass.javaClass); 14. if(applicationCpile()=null) 15. Play.classes.classes.remove(applicationC); 16. else 17. applicationClass.enhance(); 18. BytecodeCache.cacheBytecode(applicationClass.enhancedByteCode,applicationC,applicationClass.javaSource); 19. newDefinitions.add(newClassDefinition(applicationClass.javaClass,applicationClass.enhancedByteCode); 20. 21. 22. try 23. HotswapAgent.reload(newDefinitions.toArray(newClassDefinitionnewDefinitions.size(); 24. catch(ClassNotFoundExceptione) 25. thrownewUnexpectedException(e); 26. catch(UnmodifiableClassExceptione) 27. thrownewUnexpectedException(e); 28. 29. /Checknewannotations 30. for(Classclazz:annotationsHashes.keySet() 31. if(annotationsHashes.get(clazz)!=computeAnnotationsHash(clazz) 32. thrownewRuntimeException(Annotationschange!); 33. 34. 35. /Nowcheckifthereisnewclassesorremovedclasses 36. inthash=computePathHash(); 37. if(hash!=this.pathHash) 38. /Removeclassfordeletedfiles! 39. for(ApplicationClassapplicationClass:Play.classes.all() 40. if(!applicationClass.javaFile.exists() 41. Play.classes.classes.remove(applicationC); 42. 43. if(applicationC.contains($) 44. Play.classes.classes.remove(applicationC); 45. 46. 47. thrownewRuntimeException(Pathhaschanged); 48. 49. HotswapAgent类的 reload 方法如下:1. publicstaticvoidreload(ClassDefinitiondefinitions)throwsUnmodifiableClassException,ClassNotFoundException 2. instrumentation.redefineClasses(definitions); 3. 读到这里,也就弄清楚了 play! 怎么实现 h

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论