还记得刚接触插件开发不久的时候,加上看了点OSGI协议(其实,当时根本看不懂~_~),留下了如下的错觉:
1、我的插件在不用的时候会被自动stop的。例如我的插件主要贡献了一个自定义的编辑器,如果用户把我提供的编辑器都关闭了,我的插件会马上被自动stop掉;用户过会再打开的时候,我的插件会再启动回来
2、基于以上观点,我的资源释放就放在我的Plugin.stop中,反正会马上被释放(不管eclipse实例--osgi framework--是否退出)
3、...
想想当初,当时是把OSGI协议中的bundle生命周期管理想象的过于神话了。可能是不想轻易放弃自己的观点,所以后来特意又仔细看了两次OSGI协议,里面确实讲了Bundle会被stop,而且如果stop的过程中发生异常,osgi framework会怎样处理云云......但是,翻了几遍也只发现了默认两种情况下Bunlde会被stop:
1、OSGI framework退出的时候。映射到Eclipse插件开发场景下,也就是说当Eclipse实例退出的时候,我们的Plugin肯定会被stop
2、在支持osgi控制台的协议实现中,用户可以通过_stop来强制stop一个bundle。(这种情况,在Eclipse插件开发的场景下,就不讨论了)
难道让我自己去判断我的插件是否被使用了,然后自己stop自己???
看来有点心灰意冷了,自己想要的那种自己的Eclipse插件会在不用的时候马上stop,用的时候再马上start的效果(注明:在osgi framework即Eclipse实例一直运行的情况下)是不存在的。于是,有点不相信协议了,就直接去翻了一下Eclipse对osgi的实现代码,发现Bundle.stop被调用的地方非常少,总结一下基本上两种情况:
1、osgi framework在用,在framework退出的时候,stop掉俺的插件
2、FrameworkCommandProvider在用,那不用说了,就是osgi控制台命令行在使用了
Eclipse,难道你即时动态地判断一下俺的插件是否可以被stop就这么难吗?
确实很难,关于这个问题过两天闲下来会写个豆腐块文章来大胆地揣测一下(这可能涉及到了osgi对状态支持等...)
说到这边,有人可能会问了?为什么不在程序里面强制调用Bundle.stop来stop掉自己想stop的插件呢?
关于这个问题的原因也挺复杂的,插件的上下文环境、目标插件所处的位置......总之,如果不是osgi那块的高手,在做Eclipse插件开发的过程中,最好不要这么做!!!
现在
,我们基本可以瞑目了,对一般Eclipse插件开发者,请记住如下可能看起来不是太严谨的结论吧:
的确,你的插件会被lazy start,但是一旦start了,就等到Eclipse实例退出的时候stop吧。
再想想以前犯的错误:把心想马上释放的资源直接丢到了Bundle.stop中。那知道,直到Eclipse实例退出的时候,它才被执行啊....
本博客中的所有文章、随笔除了标题中含有引用或者转载字样的,其他均为原创。转载请注明出处,谢谢!