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.55-ga55。
http://localhost:8080でLiferayへのサインインします。 メールアドレス_test@liferay.com_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順に従います。
Download and unzip
liferay-j1h1.zip
.curl https://learn.liferay.com/dxp/latest/ja/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サービスを使用することを検討してみましょう。 依存関係の構成 では、モジュールを見つけて依存関係として構成する方法を示しています。