OSGiサービスの使用
Liferay APIは、OSGiサービスとしてすぐに利用できます。 次のように、そのサービスタイプのフィールドを作成し、そのフィールドに @Reference
アノテーションを付けることで、サービスにアクセスできます。
@Reference
BlogsEntryService _blogsEntryService;
上記の_blogsEntryService
フィールドは、 BlogsEntryService
OSGiサービスにアクセスします。
すべてのDeclarative Servicesコンポーネント( @Component
でアノテーションが付けられたクラス)は、この方法でOSGiサービスにアクセスできます。 ランタイムフレームワークは、コンポーネントの@Reference
のアノテーションが付いたフィールドにサービスタイプを挿入します。
次の例は、Greeter
と呼ばれるOSGiサービスの使用を示しています。 3つのモジュールは、OSGiサービスで使用される API-Provider-Consumer パターンを示しています。
- API モジュールは、
Greeter
サービスタイプを定義します。 - 実装モジュールは
Greeter
サービスを 提供 します。 - サンプルモジュールは
Greeter
サービスを 消費 します。
サンプルモジュールクラスは、Greeter
サービスを使用してパーソナライズされた挨拶を返すGogo シェルコマンドを作成します。 この例をOSGiサービスの「Hello World」と考えてください。
OSGiサービスは任意のJavaクラスで使用できます。
LiferayサービスのJavadocは こちら から入手できます。
OSGiサービスの作成方法については、 OSGiサービスとしてのAPI を参照してください。
Gogo シェルコマンドの例をデプロイする
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.86-ga86。
http://localhost:8080でLiferayへのサインインします。 メールアドレス_test@liferay.com_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順を実行します。
liferay-j1h1.zip
をダウンロードして解凍する。curl https://resources.learn.liferay.com/dxp/latest/en/liferay-internals/fundamentals/liferay-j1h1.zip -O
unzip liferay-j1h1.zip
サンプルモジュールをデプロイします。
cd liferay-j1h1
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.j1h1.api_1.0.0 STARTED com.acme.j1h1.impl_1.0.0 STARTED com.acme.j1h1.osgi.commands_1.0.0
Gogo シェルを開きます。
Gogo シェルコマンドフィールドに、
j1h1:greet
コマンドを入力して、挨拶を生成します。j1h1:greet "Captain Kirk"
出力を確認します。
Hello Captain Kirk!
この例のモジュールは、APIおよび実装モジュールを利用して、j1h1:greet
Gogo シェルコマンドから返されるコンテンツを生成します。
OSGiサービスの使用方法
ビジネスロジックの作成
クラスでは、必要なOSGiサービスを使用してビジネスロジックを実装します。
サービスをインポートします。
import com.acme.j1h1.Greeter;
サービスを使用します。
public void greet(String name) { _greeter.greet(name); } private Greeter _greeter;
上記のメソッドは、Greeter
のgreet
メソッドを呼び出します。 com.acme.j1h1.Greeter
は、実装モジュールが登録するOSGiサービスタイプです。 クラスは、OSGiサービスレジストリからGreeter
インスタンスを取得する必要があります。
外部サービスリファレンスの注釈
レジストリからOSGiサービスを取得するには、そのサービスタイプのフィールドに @Reference
アノテーションを追加する必要があります。 @Reference
をサービスフィールドに追加します。
@Reference
private Greeter _greeter;
J1H1OSGiCommands
クラスには、_greeter
と呼ばれる上記のプライベートGreeter
フィールドがあります。 @Reference
アノテーションは、レジストリからのGreeter
サービスをフィールドに挿入するようにOSGiランタイムに指示します。 J1H1Greeter
がレジストリ内で最も一致するGreeter
サービスコンポーネントである場合(この例ではこれが唯一の一致です)、ランタイムは_greeter
にJ1H1Greeter
を挿入します。
クラスをコンポーネントにする
@Reference
アノテーションを使用できるのは、Declarative Servicesコンポーネントのみです。 @Component
アノテーションをクラスに追加し、service
属性を使用して、コンポーネントが特定のサービスを実装していることを宣言します。
@Component(
property = {"osgi.command.function=greet", "osgi.command.scope=j1h1"},
service = J1H1OSGiCommands.class
)
public class J1H1OSGiCommands {
J1H1OSGiCommands
クラスは、独自のタイプのOSGiサービスを提供します。 2つのプロパティは、j1h1
というスコープでgreet
というコマンド関数を使用してGogoシェルコマンドを定義します。 デプロイされたJ1H1OSGiCommands
コンポーネントは、String
を入力として受け取るGogo シェルコマンドj1h1:greet
を提供します。
APIへの依存関係を追加する
コンシューマモジュールはAPIに依存します。 build.gradle
ファイルで、依存関係にAPIを追加します。 j1h1-osgi-commands
モジュールのbuild.gradle
ファイルは次のとおりです。
dependencies {
compileOnly group: "com.liferay.portal", name: "release.portal.api"
compileOnly project(":j1h1-api")
}
release.portal.api
アーティファクトは、モジュールが現在のLiferay製品リリースから必要とするLiferay、Bnd、およびOSGiサービスを提供します。 [project root]/gradle.properties
ファイルのliferay.workspace.product
は、リリースを指定します。
ローカルプロジェクトj1h1-api
はGreeter
サービスを提供するため、j1h1-osgi-commands
はアーティファクトではなくプロジェクトとしてそのサービスに依存できます。 外部アーティファクトに依存関係を指定することも簡単です。
まとめ
APIモジュールとImplモジュールは、それぞれGreeter
サービスを定義および提供しました。 例のj1h1-osgi-commands
モジュールは、サービスを使用して単純なGogo シェルコマンドを作成します。 API-Provider-Consumer契約によって疎結合が促進され、ソフトウェアの管理、拡張、およびサポートが容易になります。
隣接するプロジェクトからOSGiサービスを使用することに慣れてきたので、外部アーティファクトからOSGiサービスを使用することを検討してみましょう。 依存関係の構成 では、モジュールを見つけて依存関係として構成する方法を示しています。