2015-11-26 48 views
0

在開發過程中,我們傾向於分解我們的聲明性服務組件,所以OSGi自然不會激活其他相關組件。有沒有辦法來診斷潛在的問題,即。 「爲什麼組件沒有被激活?」OSGi診斷組件的缺失依賴

對於一個簡單的依賴圖:

A------>B------>C------->E 
       ^
       | 
     D-------+ 

E未能被激活所有相關組件,CDBA沒有得到激活。我需要一個控制檯命令來問「爲什麼A未被激活?」答案將包含答案:「A取決於B,B取決於C,C取決於E,E不可用」。

+0

可能沒有。如果E不活躍,則其受撫養人不能被激活。當我試圖手動激活一個組件(比如說B)時,這會變得更加清晰,但是日誌說因爲E沒有解析,所以你不能激活B.所以,你需要首先激活E。 – Abie

回答

1

目前尚不存在,儘管它可以使用ScrService API開發。這當然會成爲一個有趣而有用的項目。

你的兩個診斷選項的瞬間是:

  1. 在GOGO殼scr:listscr:info命令。這些會告訴你爲什麼一個單獨的組件不活躍。例如,如果你問A爲什麼不活躍,它會告訴你它有一個未被滿足的B服務參考。然後,您將不得不跟蹤哪個組件應該註冊B服務,並找出爲什麼它不是活動的。等等。

  2. X-Ray plugin for Felix WebConsole將爲您提供服務和組件的圖形表示。它不會直接爲您提供根據要求提供的根源,但它可以幫助有經驗的用戶更快速地找到比scr命令更快的問題。

+0

如果你需要一個工作的例子,在Apache Felix Dependency Manager中,我們已經實現了一個shell命令來完成這個工作。它使用內部API來完成繁重的工作。我並不是建議你應該拋棄DS,而是應該像Neil所暗示的那樣,使用該代碼作爲例子(自己實現這樣的邏輯)。作爲參考,它是「dm wtf」命令(我們都知道的縮寫代表「失敗在哪裏」;))。 –

+0

謝謝馬塞爾。構建這種診斷的主要問題是組件不依賴於組件。一個組件取決於一個* service *,它可能會或可能不會被另一個組件提供。所以你構建的任何解決方案都必須使用一定數量的猜測和啓發式。它仍然是有用的,只是不完美。 –

+0

謝謝。順便說一句,如果你正在使用equinox(和我一樣),相應的命令是「list」和「comp」。命令在這個文件中實現:[SCRCommandProvider.java](http://bit.ly/1MTuGJ6) – b10y