2011-07-28 41 views
1

OSGi的聲明式服務被明確地允許有一個綁定方法,無需爲基準的匹配解除綁定的方法,因爲「一旦組件配置被停用時,SCR必須拋棄到的所有參考文獻組件實例和與激活關聯的組件上下文「。OSGi的DS:省略解除綁定的方法與Felix SCR @Reference註釋

我使用Apache Maven的費利克斯-SCR-插件生成從Java5的註解我的服務組件XML。如果我忽略從@Reference標註了「取消綁定」屬性,然後我得到這個故障:

[ERROR] @Reference: Missing method unbind for reference configuration at Java annotations in <classname>:<linenum> 

爲什麼SCR發電機這麼嚴格?有沒有辦法讓它容忍一個省略的解除綁定方法?也許我需要向Felix提出缺陷?

當然,它會很容易,只是微不足道的解除綁定方法添加到我的服務,但該規範說,他們是不需要的。

回答

3

你引用的文字(112.5.13綱要V4.2)不直接涉及到解除綁定是指失活,而這又需要解除綁定。後來在規範(112.5.15)中規定:「對於使用事件策略的每個引用,必須爲該引用的每個綁定服務調用解除綁定方法。」

編輯忽略上面,見下面的評論。在Felix SCR的當前版本中,默認情況下啓用「generateAccessors」,您絕對不需要編寫綁定/取消綁定方法。 IIRC在2011年7月並非如此。

+0

有趣的,所以「必須被稱爲」說,解除綁定方法實際上是必需的?我的理解是,無論如何這個服務實例將被拋棄,所以如果引用不被忽略就沒有什麼大不了的。但似乎可能是不正確的。 –

+0

由於服務實例沒有被代理,所以放棄它的唯一方法是將其歸零。在卸載捆綁包的情況下,捆綁包的類加載器加載的類的所有實例都必須爲無效狀態,以確保整個捆綁包(類加載器,所有類和實例)都被垃圾收集。 – earcam

+1

@Chris,只是修改插件 - 有一個配置選項「generateAccessors」 - 我還沒有嘗試過,但猜測如果你設置爲true,它會爲你生成un/bind方法。 – earcam

0

Bnd也從註釋生成DS XML,並沒有此限制。

1

如果您使用規範中的標準DS註釋,bnd將生成XML,您甚至不需要單獨的Maven插件。

順便說一句,你應該始終有一個解除綁定方法如果參考政策是動態的 - 即使基數是強制性的,因爲你可能要處理動態重新綁定。在這種情況下,bnd將發出警告,而不是錯誤。

當參考策略是靜態時,解除綁定方法是完全不必要的。在這種情況下,組件實例必須被銷燬,所以你可以在停用方法中進行清理。

相關問題