2016-05-20 7 views
1

私はosgiコンポーネント/サービスの複数のインスタンスを使用しています。 これらのosgiコンポーネントは、Configuration Policy =必須でインスタンス化され、ConfigurationAdmin経由で構成を追加または削除することによって削除されます。 さらに、サービスインスタンスの「セット」を使用し、各セットは、その構成を介して、リファレンスと同じセットのサービスインスタンスのみを使用するように構成されています(ref.target =(id = "123"))。OSGi ConfigAdminサービスの削除

問題: ある時点では、セットを削除する必要があります。しかし、ConfigAdmin経由で1つのセットから設定オブジェクトを削除すると、別のセットのサービスの一部も無効になります。彼らは即座に再起動しますが、すべてのサービス参照を失い、使用できなくなります。

私は彼らがなぜ非活性化しているのか分かりません。

EDIT

、サービスは、典型的には、このように定義される:

@Component(policy = ConfigurationPolicy.REQUIRE) 
@Service 
public class AServiceImpl implements AService { 

    @Reference(target = "(service.pid=*)") 
    BService bService; 

    ... 
} 

BServiceImplはまた、必要な設定ポリシーを使用します。利用できるようにする特定のサービスを選択するには、サービス対象のフィルタ

ターゲットが原因フェリックスSCRからこのdocスニペットの注釈に設定されています。この値の値を構成プロパティーで上書きできるようにするには、このパラメーターを宣言する必要があります。各サービス

ため

:パラメータが宣言されていない場合は、「設定」の新しいサービスは、これらの手順は、セットのすべてのサービスのために実行されているインスタンス化されると、それぞれの宣言属性は

を生成されることはありません各サービス

Properties serviceProperties.put(ref + ".target", "(" + PID + "=" + pid + ")"); 
... 
serviceConfiguration.update(dict); 

の各参照用

Configuration serviceConfiguration = configurationAdmin.createFactoryConfiguration(serviceInterfaceName, null); 

Iは設定を記録しbindXXX()メソッドの参照のpidとフィルタが機能しているようです。私はいつも等しいpidで参照を得る。

実行例をgithub asapに追加します。

EDIT2

私は行動を示す例を追加しました。私は、サービスの2つの "セット"を作成し、サービス機能を呼び出し、機能が終了した後にサービスセットを削除します。サービスセット1を削除すると、サービスセット2が再度アクティブになります。

コード例 https://github.com/andineupert/osgi-configadmin-example.git

+0

Githubで小さなデモンストレータを作れますか? –

+0

いくつかのサンプルコードなしでは、問題を推測することさえ不可能です。 –

+0

アイデアや提案はありますか? – andineupert

答えて

1

私は最終的にそれが宣言型サービスの古い春分の実装によって引き起こされた実現。私はorg.apache.felix.scr 2.0.4に切り替え、今は完全に動作しています。

関連する問題