モジュールのライフサイクル
OSGiでは、すべてのコンポーネント、Javaクラス、リソース、および記述子がモジュール(OSGiバンドル)を介してデプロイされます。 MANIFEST.MFファイルは、モジュールがエクスポートおよびインポートするパッケージなど、モジュールの物理的特性を記述します。 モジュールのコンポーネント記述ファイルは、その機能特性(つまり、そのコンポーネントが提供および消費するサービス)を指定します。 モジュールとそのコンポーネントにも、独自のライフサイクルと管理APIがあります。 Declarative Serviceとシェルツールを使用すると、モジュールとコンポーネントのデプロイをきめ細かく制御できます。
モジュールのコンテンツはそのアクティブ化に依存するため、アクティブ化の手順を検討してください。
-
インストール:モジュールJARを
[Liferay Home]/deployフォルダにコピーすると、モジュールがOSGiフレームワークにインストールされ、モジュールにINSTALLEDとマークされます。 -
解決:すべてのモジュールの要件が満たされると(たとえば、インポートするすべてのパッケージが使用可能になると)、フレームワークはモジュールのエクスポートされたパッケージを公開し、モジュールに
RESOLVEDとマークを付けます。 -
アクティベーション: モジュールはデフォルトで 積極的に アクティベートされます。 つまり、フレームワークで開始され、解決時に
ACTIVEとマークされます。 アクティブなモジュールのコンポーネントが有効になります。 以下のマニフェストヘッダーに示すように、モジュールがlazyアクティベーションポリシーを指定した場合、別のモジュールがそのクラスの1つを要求した後にのみアクティブ化されます。Bundle-ActivationPolicy: lazy
次の図は、モジュールのライフサイクルを示しています。

Apache Felix Gogo Shellを使用してライフサイクルを管理できます。 モジュールをインストール/アンインストールして、それらを開始/停止することができます。 モジュールを更新し、依存モジュールに更新を使用するように通知できます。 Liferay のツール ( Liferay Workspace、 Blade CLI、 Liferay Dev Studio など) は、OSGi Admin API を使用する同様のシェル コマンドを提供します。
モジュールをアクティブ化すると、そのコンポーネントが有効になります。 ただし、使用できるのはアクティブ化されたコンポーネントのみです。 コンポーネントをアクティブ化するには、参照されているすべてのサービスが満たされている必要があります。 つまり、コンポーネントが参照するすべてのサービスが登録されている必要があります。 参照に一致する最高ランクのサービスがコンポーネントにバインドされます。 コンテナは、コンポーネントが参照するすべてのサービスを見つけてバインドすると、コンポーネントを登録します。 これで、アクティブ化の準備が整いました。
コンポーネントは、 遅延 (デフォルト) または 即時 アクティベーション ポリシーを使用できます。 即時アクティベーションを指定するには、開発者は属性 immediate=true を @Component アノテーションに追加します。
@Component(
immediate = true,
...
)
即時アクティベーションが指定されていない限り、コンポーネントのアクティベーションは遅延されます。 つまり、コンポーネントが要求されると、コンポーネントのオブジェクトが作成され、そのクラスがロードされます。 このように、アクティベーションを遅らせることで、起動時間を短縮し、リソースを節約することができます。
Gogo Shell の サービス コンポーネント ランタイム コマンド を使用すると、コンポーネントを管理できます。
-
scr:list [bundleID]:モジュール(バンドル)のコンポーネントを一覧表示します。 -
scr:info [componentID|fullClassName]:コンポーネントのステータスや提供するサービスなど、コンポーネントについて説明します。 -
scr:enable [componentID|fullClassName]:コンポーネントを有効にします。 -
scr:disable [componentID|fullClassName]:コンポーネントを無効にします。 サーバーが再起動されるまで、サーバー(またはクラスター内の現在のサーバーノード)では無効になっています。
サービス参照は、デフォルトでは 静的 および 消極的 です。 つまり、注入されたサービスは、サービスが無効になるまで参照コンポーネントにバインドされたままになります。 または、参照用にGREEDYサービスポリシーを指定することもできます。 上位のマッチングサービスが登録されるたびに、フレームワークは下位のサービスを(サービスポリシーがgreedyの)コンポーネントからバインド解除し、その場所に新しいサービスを自動的にバインドします。 以下は貪欲ポリシーを使用する @Reference アノテーションです。
@Reference(policyOption = ReferencePolicyOption.GREEDY)
Declarative Serviceアノテーションを使用して、コンポーネントのアクティブ化とサービスポリシーを指定します。 Gogo シェルコマンドを使用して、モジュールとコンポーネントを制御します。