我有一個業務需求,作爲一些處理的一部分,我們爲外部託管的代碼啓用「插件」功能。如何獲得實現給定接口的所有服務,而不僅僅是活動接口?
決定最好的方法是@Reference
「排名」(根據不相關算法排序)服務的列表。或多或少是這樣的:
public interface ExternalProcessor {
void doSomething();
}
@Component
@Service(ImportantTaskManager.class)
public class ImportantTaskManager{
@Reference(cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, referenceInterface = ExternalProcessor.class)
protected List<ExternalProcessor> processors;
public void doImportantStuff(){
for(ExternalProcessor processor: processors){
processor.doSomething();
}
}
}
要儘量簡短,我ommitted儘可能多的樣板盡我所能,包括bind
/unbind
方法對。
現在,另一項業務要求是,如果存在實現未綁定到我們的主處理器的接口的服務,則我們不執行任何類型的處理(出於任何原因:未解析依賴關係,在激活期間崩潰,缺少必要的配置等)。我有一種感覺,這有點違反OSGi原則(OSGi只提供可用服務而不提供有關不可用服務的信息),但我該如何實現這一點?
到目前爲止,我想出了以下候選方案:
向外部團隊,提供我們應該在期待服務的數量,然後比較反對什麼,我們得到來自OSGi - 這是不可靠的
抓取所有已安裝的捆綁包及其從捆綁頭中獲取的元xml,尋找服務定義 - 這是......好,這是一個開始的時間。
grep
通過查找服務註冊和/或失敗的日誌 - 這似乎只是......錯誤的。
以上的任何一個適當的解決方案呢?有更好的解決方案嗎?我還能如何解決這個問題?我在這裏錯過了什麼?
爲了避免潛在的故障點,我們寧願避免依賴外部團隊不犯錯誤(向我們提供ID列表),但它似乎是一個很好的和乾淨的解決方案 - 我們可能會使用它如果沒有別的出現。謝謝! – CptBartender
經過慎重考慮(以及一些小的需求調整)後,我們決定任何「更好」的解決方案都只是一個「聰明的」「黑客」,而這個解決方案更好,暫時的。標記爲已接受的答案 - 再次感謝! – CptBartender