2016-06-27 35 views
2

我有一個業務需求,作爲一些處理的一部分,我們爲外部託管的代碼啓用「插件」功能。如何獲得實現給定接口的所有服務,而不僅僅是活動接口?

決定最好的方法是@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只提供可用服務而不提供有關不可用服務的信息),但我該如何實現這一點?

到目前爲止,我想出了以下候選方案:

  1. 向外部團隊,提供我們應該在期待服務的數量,然後比較反對什麼,我們得到來自OSGi - 這是不可靠的

  2. 抓取所有已安裝的捆綁包及其從捆綁頭中獲取的元xml,尋找服務定義 - 這是......好,這是一個開始的時間。

  3. grep通過查找服務註冊和/或失敗的日誌 - 這似乎只是......錯誤的。

以上的任何一個適當的解決方案呢?有更好的解決方案嗎?我還能如何解決這個問題?我在這裏錯過了什麼?

回答

2

我對安全插件有類似的要求。調用插件的代碼在缺少必要的安全插件時不應運行。

我通過定義像id這樣的服務屬性來解決它。每個插件都有一個唯一的ID。在你的主代碼的配置中,你可以通過你需要的id指定一個安全插件列表。

然後代碼檢查每個服務的ID並只在所有強制插件存在時激活主要組件。

+0

爲了避免潛在的故障點,我們寧願避免依賴外部團隊不犯錯誤(向我們提供ID列表),但它似乎是一個很好的和乾淨的解決方案 - 我們可能會使用它如果沒有別的出現。謝謝! – CptBartender

+0

經過慎重考慮(以及一些小的需求調整)後,我們決定任何「更好」的解決方案都只是一個「聰明的」「黑客」,而這個解決方案更好,暫時的。標記爲已接受的答案 - 再次感謝! – CptBartender

相關問題