詳細編:@Activate, @Deactivate そして @Modifiedアノテーションについて - 詳細編:@Activate, @Deactivate そして @Modifiedアノテーションについて - Japan

null 詳細編:@Activate, @Deactivate そして @Modifiedアノテーションについて
by Yasuyuki Takeo

詳細編:@Activate, @Deactivate そして
@Modifiedアノテーションについて

画像

こんにちは。
日本ライフレイ、サポータビリティエンジニアの竹生(たけお)です。

前回前々回では、OSGiアノテーションの基本についてご紹介しました。

本記事では、OSGi DSアノテーションについてさらに詳しく紹介したいとおもいます。


■ 本記事対象の知識レベルとユースケース

  • 中級レベル
  • 一般的なLiferay DXP開発に必須

*レベルの定義については、こちらのブログの冒頭で紹介しています。


※本記事はLiferay Community Blogに投稿されている”Revisiting: Revisiting OSGi DS Annotations”を翻訳したものです。配信元または著者の許可を得て配信しています。※オリジナルの英記事著者:David H Nebinger サウスカロライナ州のサマーヴィルに住むLiferay, Inc.のSoftware Architect/リードコンサルタント。Liferay Communityサイトにて、多くの技術情報を投稿するなど精力的に活動しています。

以前、アノテーションについてまとめましたが、特にドキュメントで明確にされていない@Modifiedアノテーションについて、よく質問をうけるので、今回は、ライフサイクルアノテーションについてより詳細を紹介します。この記事をきっかけにして、今後効果的に使ってもらえたらと思います。

@Activateアノテーション、@Deactivateアノテーション、および@Modifiedアノテーションは、DSコンポーネントのライフサイクルイベント通知に使用されます。コンポーネント自体がアクティブ化、非アクティブ化、または変更されたときに呼び出され、適切なアクションを実行することができます。

これらのライフサイクルイベントは、@Componentが実際に動作している場合にのみ実行されます。必須@Referenceが設定されていない場合、@Componentは動作しないため、@Activate(および他の)メソッドも呼び出されません。

@Activate


@Activateアノテーションは、コンポーネントが読み込まれ、サービスが提供できる状態になったことを通知するために使用します。このメソッドを使って、コンポーネントの最終設定を行います。これは、SpringのafterPropertiesSet()InitializingBeanインタフェースに相当します。

@Activateメソッドの利点の1つは、作成するメソッドのシグネチャが固定されていないことです。以下のパラメータのうちの1つ以上を持つことができます:

 Map プロパティ: @Componentプロパティのプロパティマップには、ConfigurationAdminプロパティも含めることができる。
 BundleContext
 bundleContext:
アクティブ化されているコンポーネントを保持するバンドルのバンドルコンテキスト。該当バンドルの保持データを探し回る必要がなくなり、ServiceTracker利用する時に効果を発揮します。
 ComponentContext: コンポーネントコンテキストには上記オブジェクトが含まれるが、ほとんどの場合、コンポーネント自体に関するコンテキスト情報をもつ。

 

たとえば以下の@Activateメソッドは、それぞれすべて有効とみなされます。

@Activate
protected void activate() {...}

@Activate
protected void afterPropertiesSet(Map props,
    BundleContext bCtx) { ... }

@Activate
public void dontCallMe(BundleContext bundleContext,  Map properties,
    ComponentContext componentContext) { ... }

つまり、任意のメソッド名(Liferay内部のコードでは”activate◎◎”を使用する傾向がありますが)、任意の順序で、パラメータを組み合わせることができます。

@Deactivate


@Deactivateは、コンポーネントが非アクティブ化されるときに呼び出されるものであることは、分かりやすいかと思います。ただ、具体的にいつ呼び出されているのかが明確でない方も多いのではないでしょうか。

基本的には、実際のバンドル無効化が実行される前に、コンポーネントコンテキストがまだ有効であることを保証します。それにより、コンポーネントが消えてしまう前に、このライフサイクルイベントを使用して正しくクリーンアップすることができます。

ServiceTrackerを開いている場合は、閉じる必要があります。ファイルが開いている場合や、DBやリソースを接続している場合は、@Deactivateエントリポイントを利用してリソースのクリーンアップを実行できます。

@Activateアノテーションと同様に、@Deactivateメソッドのメソッドシグネチャは可変です。 @Activateと同じパラメータをすべてサポートし、追加の値で、バンドルが無効にされた理由を保持する”int”があります。

私自身は、これまでこのパラメータを利用する機会はありませんでしたが、場合によっては良い使いみちがあるかもしれません。具体的なコードと説明を確認したい場合は、このFelixチケットをチェックしてみてください(英語):https://issues.apache.org/jira/browse/FELIX-925

@Modified


私の知る限り、@Modifiedは、ドキュメントがほぼないアノテーションの1つです。笑
「このメソッドはサービスコンテキストが変更されたときに呼び出される」と説明しているブログや記事などは見ることがあるかと思いますが、そうした記事は、そもそもサービスコンテキストを理解している前提で書かれています。

ざっくり説明すると、主に構成の変更(構成管理など)が行われたときにこのメソッドが呼び出されます。そもそもサービスコンテキストを理解している前提で書かれています。

ほとんどの場合、@Activateメソッドに、コンポーネントのプロパティを受け取るためのコードをいくつか持っており、必要な値をコンポーネントにキャッシングし、後々のトラッキングを不要にします。このやり方でも、コントロールパネルで、設定管理のプロパティが変更されたりしない限り、問題ではありません。

しかし誰かが設定管理のプロパティを変更してしまったりすると、あなたのコンポーネントで保持している値と同期が取れなくなってしまいます。

この場合、唯一の選択肢は、再起動することですが、それでは少し面倒です。(サービス、コンポーネント、またはコンテナはすべて新しい値を取得することになります)。

そんなケースで@Modifiedが役立ちます。
@Modifiedは、コントロールパネルから、またはosgi / configs / .configファイルへの変更を介して、設定管理プロパティの変更が行われたとき、通知される方法のことです。
@Modifiedアノテーションがあると、ローカルキャッシュの値も常にオリジナルの値と同期することができ、データが変更されたときでも再起動する必要はありません。

Liferayコードで次のように設定しているメソッドがあります。

@Activate
@Modified
protected void activate(Map properties) { ... }

2つのライフサイクルイベントで、同じメソッドが使用されています。
この際、@Modifiedを呼び出しで不具合が起きないよう、メソッドが設定されていることを確認してください。たとえば、ServiceTrackerを起動している場合、実装に気をつけないと、@Modified通知はトラッカーを再起動してしまいます。

基本的には、別々のメソッドを使った方が、上記のような心配をする必要がないため、おすすめです。

@Modifiedメソッドのメソッドシグネチャは、@Activateと同じ規則に従うため、同じパラメータタイプはすべて使用できます。必要であれば、バンドルコンテキストまたはコンポーネントコンテキストにもアクセスできます。

まとめ


@Activateを使用すると、コンポーネントが開始される際、ライフサイクル通知を取得できます。

@Deactivateを使用すると、コンポーネントが停止する前に、クリーンアップすることができます。

@Modifiedを使用すること、不必要な再起動を避けることができます。

 

いかがでしたでしょうか? 私がLiferay 7 CE / Liferay DXPでこれまでに遭遇したすべてのアノテーションを紹介してみました。これらの詳細情報が、みなさんのLiferay開発に役立てば幸いです。

私が見逃しているアノテーション見つけたり、もっと詳細をしりたいものがあれば、いつでも聞いてください。

 

本記事のお問い合わせはこちらまで→yasuyuki.takeo@liferay.com

 


その他アノテーション紹介記事:

【前編】OSGiアノテーションとは?その紹介と活用法

【後編】OSGiアノテーションとは?その紹介と活用法


 

■ これまで発信してきた日本語による技術コンテンツを、Qiitaでお読みいただけます。よろしければそちらの記事も合わせてご役立てください。
https://qiita.com/yasuflatland-lf

Doorkeeperのライフレイコミュニティメンバー大歓迎!
コーポレートブログの技術コンテンツ更新情報など定期的におとどけしています。
https://liferay.doorkeeper.jp/

業界最高の評価

Gartner

Gartnerレポート:『リーダー』に位置づけ
ライフレイは9年連続で、Gartner社によるデジタルエクスペリエンスプラットフォーム(DXP )分野のマジック・クアドラントにおいて、リーダーに選出されました。

レポートの詳細、ダウンロード