還記得剛接觸插件開發不久的時候,加上看了點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實例退出的時候,它才被執行啊....
本博客中的所有文章、隨筆除了標題中含有引用或者轉載字樣的,其他均為原創。轉載請注明出處,謝謝!