カスタムOSGiサービスの作成

OSGiサービスを実装するときがきました。サービスとサービス参照の詳細を確認していない場合は確認してください。ここでは、サービスインターフェイスを実装し、そのタイプのOSGiサービスとして宣言し、他のコンポーネントとのバインドに最適なカスタムサービスを作成します。

サンプルのカスタムサービスCustomServiceImpl(サンプルモジュールoverriding-service-referenceより)では、サービスインターフェイスSomeServiceを実装し、SomeServiceサービスタイプのOSGiサービスとして宣言し、さらに既存のサービスに作業を委任します。 カスタムサービスを作成する手順に従って、このサンプルコードを調べます。

@Component(
property = {
"service.ranking:Integer=100"
},
service = SomeService.class
)
public class CustomServiceImpl implements SomeService {

@Override
public String doSomething() {

StringBuilder sb = new StringBuilder();
sb.append(this.getClass().getName());
sb.append(", which delegates to ");
sb.append(_defaultService.doSomething());

return sb.toString();
}

@Reference  (
target = "(component.name=override.my.service.reference.service.impl.SomeServiceImpl)"
)
private SomeService _defaultService;
}

カスタムOSGiサービスを作成する手順は次のとおりです。

  1. モジュールを作成します

  2. 目的のサービスインターフェイス実装するようにカスタムサービスクラスを作成します。上記の例では、CustomServiceImpl implements SomeServiceです。 ステップ5(後述)に、インターフェイスメソッドの実装を示します。

  3. クラスを、サービスインターフェイスへの参照に最適なDeclarative Servicesコンポーネントにします。

    • @Componentアノテーションとservice属性を使用して、クラスをDeclarative Services(DS)コンポーネントにします。これにより、クラスがOSGiサービスレジストリで使用できるOSGiサービスであると宣言されます。上記のサンプルクラスは、サービスタイプSomeService.classのDSサービスコンポーネントです。

    • service.ranking:Integerコンポーネントプロパティを使用して、サービスを既存のサービスよりも上位にランク付けします。上記の"service.ranking:Integer=100"プロパティでは、この例のランキングが100に設定されています。

  4. 既存のサービス実装を呼び出す場合は、既存のサービスへのDeclarative Services参照を使用するフィールドを宣言します。サービスを調べたときにコピーしたcomponent.nameを使用して、既存のサービスを対象にします。上記の例は、次のように既存のサービスを参照しています。

    @Reference  (
    target = "(component.name=override.my.service.reference.service.impl.SomeServiceImpl)"
    )
    private SomeService _defaultService;
    

    このフィールドでは、カスタムサービスで既存のサービスを呼び出すことができます。

  5. インターフェイスのメソッドをオーバーライドします。オプションで、既存のサービス実装に作業を委任します(前の手順を参照)。

    サンプルのカスタムサービスのdoSomething メソッドは、元のサービス実装に作業を委任しています。

  6. モジュールをデプロイして、カスタムサービスをOSGiランタイムフレームワークに登録します。

実装したサービスタイプを参照し、その参照ポリシーオプションがgreedyに設定されているコンポーネントは即座にカスタムサービスにバインドされます。既存のサービスにバインドされ、参照ポリシーオプションがreluctantに設定されているコンポーネントは、新しいサービスを使用するように動的に再構成できます。次で説明します。

関連トピック

OSGi Services and Dependency Injection with Declarative Services

« オーバーライドするOSGiサービスの確認OSGiサービスを使用するようにコンポーネントを再構成する »
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています