类的热拔插功能该如何实现

03-04-30 hegong121

比如我实例化了一个类,该类的class文件在该实例的生命期内被更新,当系统得知了这一消息后,终止该实例并载入新类后实例化该类。请问,我该如何让JVM从类文件中重新获取该类?谢谢

wys1978
2003-04-30 21:39

没有实际做过, 从看过的资料知道大概这样做:
1. 实现你自己的ClassLoader, 给这个loader加listener
2. listener监听loaded的文件last update time 属性来触发管理终止实例的事件
3. 终止实例以后, 把旧的loaded的class文件clear掉, 重新调用一次新的文件.

难点是在于怎样处理已经实例化的Class的引用, 统一终止掉?
在做某些server的应用中才会有这样的需求吧?

你可以参考一下resin和phoenix源代码, 它们都有Plug and Play的功能的.

hegong121
2003-05-01 01:51

你的疑题提得非常好,是这样的,我的系统是可以通过JMX进行远程更新的,通过MBean我可以让系统知道哪些模块需要重启(而不是服务器重启)。我的每个模块仅提供一组facade与外界通信,这些facade实际上由proxy模式实现,系统可跟踪每个被实例化的proxy。当更新消息到达时,proxy中的被代理对象被置换(销毁该对象),取而代之的是一个只能抛出ApplicationExpiredException的代理对象,这样就解决了处理对象引用的问题。
至于ClassLoader,是否有详细的资料?

wys1978
2003-05-01 22:35

不了解JMX技术, 不能帮什么忙
这个是ClassLoader javadoc的link:
http://java.sun.com/j2se/1.4.1/docs/api/java/lang/ClassLoader.html

希望对你有用, good luck with your project.

Jevang
2003-05-02 00:03

I am curious about your jmx client UI, I have tried html adaptor from Sun and JBoss, and a swing based one( I don't remember, someone post on theserverside ), they did save me the effort to build my own console, but with some many things under some many categories to monitor/control, I need a better jmx console tool that's easy customizable.

Quake is right on the point about classloader, what we did here is throw exception if old instance is still refereneced. Sorry can't give you the code as it's not my own, but it's very basic once you read the jdk doc.

3Go 1 2 3 下一页