posts - 42,comments - 83,trackbacks - 0
        在一个运营系统中,如果出现业务方法变更,而我们使用的应用服务器不支持热部署的话,那么重启可能是更新的唯一选择。目前多数应用服务器不支持热部署,包括生产模式下的weblogic。之所以说是生产模式,weblogic在开发模式下是支持这种动态更新的,即我们只要替换部署目录下的类文件,重新访问时可以看到新业务方法生效,而且即使在生产模式下,weblogic也能"支持"动态更新,但做法上比较麻烦,需要使用version信息控制应用,这个功能weblogic9就开始提供,但好像很少有客户这么用过。如果应用服务器不支持动态更新,我们有什么方法可以满足这种需求吗? 这就是我们这篇文章要讲述的,通过TI(更准确地说是JDI),我们可以实现。

        为了能够正确的做到动态更新,我们首先需要attach到target JVM上,具体方法参考http://www.blogjava.net/fjin/archive/2009/09/10/294443.html

         连接上target JVM后,我们可以就可以利用vm提供的redefineClasses()将新的类文件注入到JVM中,替代原有的class信息。

 1     public void reloadClasses(List toReloads){
 2         Map toReloadMap = new HashMap();
 3         for (Iterator iterator = toReloads.iterator(); iterator.hasNext();) 
 4         {
 5             String toReload = (String) iterator.next();
 6             InputStream is = VMDebugger.class.getClassLoader().getResourceAsStream(toReload.replace('.''/'+ ".class");
 7             if (is == null) {
 8                 throw new RuntimeException("Class " + toReload + " is not found in current classpath");   
 9             }
10             List classes = vm.classesByName(toReload);
11             if (classes == null || classes.isEmpty()) {
12                 throw new RuntimeException("Class: " + toReload + " is not found in target JVM");
13             } else {
14                 ReferenceType ref = (ReferenceType) classes.get(0);
15                 try{
16                     toReloadMap.put(ref, toByteArray(is));
17                 }catch(Exception e){
18                     e.printStackTrace();
19                 }
20             }
21         }
22         vm.redefineClasses(toReloadMap);
23     }

        上面的方法有如下几个注意的地方:
         1:确保要更新的类在当前classpath下(也就是启动VMDebugger的classpath)。
         2:确保要更新的类在target JVM已被加载。
         3:不同的VM实现上不一样,有的可能不允许动态更新,可以使用canRedefineClasses()
判断一下。
posted on 2009-09-11 00:04 走走停停又三年 阅读(2763) 评论(5)  编辑  收藏 所属分类: Java Technology

FeedBack:
# re: JVM TI学习(2)----如何动态更新JVM中的class文件
2009-09-10 23:22 | Ken Wu
你这是instrumentation吧?TI的使用还不太一样。  回复  更多评论
  
# re: JVM TI学习(2)----如何动态更新JVM中的class文件[未登录]
2009-09-11 12:16 | 礼物
用javassist 里面的一个hotswap也可以的~~  回复  更多评论
  
# re: JVM TI学习(2)----如何动态更新JVM中的class文件
2009-09-11 12:17 | 摩卡主机
提供做好的java虚拟主机 独立tomcat 独立jvm  回复  更多评论
  
# re: JVM TI学习(2)----如何动态更新JVM中的class文件
2009-09-11 12:31 | 走走停停又三年
@礼物
学习了,谢谢 :)
  回复  更多评论
  
# re: JVM TI学习(2)----如何动态更新JVM中的class文件
2009-09-13 12:34 | 凡客诚品
学到东西了~谢谢  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: