2016-06-27 4 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(); 
     } 
    } 
} 

短いそれを維持するために、私はbind/unbindメソッドのペアを含む、私はできる限りの定型を、省略さしました。

ExternalProcessorインターフェイスを実装しているサービスがメインプロセッサにバインドされていない場合は、何らかの処理を行わないという要件があります(何らかの理由で、解決された依存関係ではなく、起動時にクラッシュします、必要な構成が欠落しているなど)。私はそれがOSGiの原則(OSGiが利用できないサービスについての情報とは対照的に利用可能なサービスのみを提供する)に対しては一種だと感じていますが、どうすれば実現できますか?

は、これまでのところ、私は解決策のために、次の候補を作ってみた:

  1. は、我々が期待することになっているサービスの数を提供するために、外部のチームを依頼し、比較すること、我々が得るものに対してOSGiから - それは信頼できない

  2. サービス定義を探しているバンドルのヘッダーから取り込まれたすべてのバンドルとそのメタXMLをクロールする - それは...時間がかかります。サービス登録および/または障害を探してログを

  3. grep - これはただ...間違っているようです。

上記のいずれかが適切ですか?より良い解決策はありますか?どのように私はこの問題に取り組むことができますか?私はここで何が欠けていますか?

答えて

2

私は、セキュリティー・プラグインのための同様の要件を持っていました。必要なセキュリティプラグインがない場合、プラグインを呼び出すコードは実行しないでください。

私は、IDのようなサービスのプロパティを定義することによってそれを解決しました。各プラグインには固有のIDがあります。メインコードの設定で、必要なIDでセキュリティプラグインのリストを指定します。

コードは、IDの各サービスをチェックし、すべての必須のプラグインが存在する場合にのみメインコンポーネントを起動します。

+0

我々はむしろちょうど失敗の電位点を避けるために(私たちにIDのリストを提供する)間違いを犯していない外部のチームによっては避けるだろうが、それは素晴らしく、きれいな解決策のように思える - 私たちは、おそらくそれを使用します他に何も現れなければ。ありがとう! – CptBartender

+0

私たちは、慎重に検討した結果、より良い解決策が「賢い」「ハック」に過ぎないと判断したので、このソリューションは単純に優れています。当分の間。受け入れられたとマークする - もう一度感謝! – CptBartender

関連する問題