1

OSGi デプロイ バンドル Apache Felix コンテナーを使用しています。Maven プロジェクト (~100 バンドル) があり、maven-scr-plugin を使用してマニフェスト ファイルと DS 記述子を生成しています。以下に説明するコードと同様の問題があります。すべてのプロバイダーが ClassA に注入されなくなるまで、ClassB をアクティブにしないようにする必要があります (ClassA に触れずに解決策があれば素晴らしいと思いますが、それは可能です)。Provider2 は、ClassB が activate メソッドを呼び出した後に ClassA に追加されるため、出力に「デフォルト」値が表示されます。後で印刷メソッドをトリガーすると、期待どおりに機能します。

OSGi を使用した経験のある方は、アドバイスをお願いします。前もって感謝します。

public interface I1{
   String getMessage(String key);
}

public interface IProvider{
   String getMessage(String key);
}
bundle1:
@Component
public class ClassA implements I1{
    List<IProvider> providers = new ArrayList<>();
    @Reference(cardinality = ReferenceCardinality.AT_LEAST_ONE, policy = ReferencePolicy.DYNAMIC)
    public synchronized void addProvider(IProvider provider) {
        providers.add(provider);
    }
    public String getMessage(String key){
        String message = null;
        for(IProvider provider: providers){
            message = provider.getMessage(key);
            if(message!=null){
                return message;
            }
        }
        return "default"
    }
}

バンドル 2:

@Component
public class Provider1 implements IProvider{

    public getMessage(String key){
       if(key.equals("key1")){
           return "value1";
       }
       return null;
    }
}

バンドル 3:

@Component
public class Provider2 implements IProvider{    
    public getMessage(String key){
       if(key.equals("key2")){
           return "value2";
       }
       return null;
    }    
}

バンドル4:

public interface I2{
    print();
}
@Component
public class ClassB implement I2{

    private I1 impl;

    @Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC)
    public void setService(I1 aService) {
        impl = service;
    }

    public void print(){
        System.out.println(impl.getMessage("key1"));
        System.out.println(impl.getMessage("key2"));
    }

    @Activate
    public void activate(){
        print();    
    }

}

出力は次のとおりです。

value1
default
4

0 に答える 0