私はいくつかの処理の一環として、外部管理コードの "プラグイン"機能を有効にするビジネス要件があります。アクティブなインタフェースだけでなく、指定されたインタフェースを実装するすべてのサービスを取得する方法?
それが最善のアプローチは@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が利用できないサービスについての情報とは対照的に利用可能なサービスのみを提供する)に対しては一種だと感じていますが、どうすれば実現できますか?
は、これまでのところ、私は解決策のために、次の候補を作ってみた:
は、我々が期待することになっているサービスの数を提供するために、外部のチームを依頼し、比較すること、我々が得るものに対してOSGiから - それは信頼できない
サービス定義を探しているバンドルのヘッダーから取り込まれたすべてのバンドルとそのメタXMLをクロールする - それは...時間がかかります。サービス登録および/または障害を探してログを
grep
- これはただ...間違っているようです。
上記のいずれかが適切ですか?より良い解決策はありますか?どのように私はこの問題に取り組むことができますか?私はここで何が欠けていますか?
我々はむしろちょうど失敗の電位点を避けるために(私たちにIDのリストを提供する)間違いを犯していない外部のチームによっては避けるだろうが、それは素晴らしく、きれいな解決策のように思える - 私たちは、おそらくそれを使用します他に何も現れなければ。ありがとう! – CptBartender
私たちは、慎重に検討した結果、より良い解決策が「賢い」「ハック」に過ぎないと判断したので、このソリューションは単純に優れています。当分の間。受け入れられたとマークする - もう一度感謝! – CptBartender