このタスクについて
すべての eXtreme Scale プラグインは、BackingMap または ObjectGrid インスタンスに適用されます。
多くのプラグインは他のプラグインと対話もします。例えば、Loader および TransactionCallback プラグインは
連携して、データベース・トランザクションやさまざまなデータベース JDBC 呼び出しと
適切に対話します。プラグインの中には、パフォーマンスを改善するために、他のプラグインの構成データを
キャッシュに入れる必要があるものもあります。
BackingMapLifecycleListener および ObjectGridLifecycleListener プラグインは、
個別の BackingMap および ObjectGrid インスタンスのライフサイクル操作が可能です。このプロセスにより、プラグインは親の
BackingMap または ObjectGrid とそれぞれのプラグインに変更があると、通知を
受けることができます。
BackingMap プラグインは BackingMapLifecyleListener インターフェースを
実装し、ObjectGrid プラグインは ObjectGridLifecycleListener インターフェースを実装します。
親の BackingMap または ObjectGrid のライフサイクルに変化があると、これらの
プラグインが自動的に呼び出されます。
ライフサイクル・プラグインの詳細については、プラグイン・ライフサイクルの管理の
トピックを参照してください。
ライフサイクル・メソッドまたは
イベント・リスナーを使用したバンドルの拡張は、次の共通タスクの中で必要になる可能性があります。
- リソース (スレッド、メッセージング・サブスクライバーなど) の開始と停止
- ピア・プラグインが更新された際の通知指定、プラグインへの直接アクセスの許可、変更の検出
別のプラグインに直接アクセスするときは、必ず
OSGi コンテナー経由でそのプラグインにアクセスして、システムのすべてのパーツが
正しいプラグインを参照できるようにしてください。例えば、アプリケーション内のあるコンポーネントが
プラグインのインスタンスを直接参照するかキャッシュに入れると、そのプラグインが動的に更新された後も、
コンポーネントはそのバージョンのプラグインへの参照を維持します。この振る舞いは、メモリー・リークのほかに
アプリケーション関連の問題の原因にもなります。したがって、コードを作成するときは、OSGi の getService() セマンティクスを
使用して参照を獲得する動的プラグインを使用してください。アプリケーションが 1 つ以上のプラグインを
キャッシュに入れる必要がある場合は、ObjectGridLifecycleListener および BackingMapLifecycleListener インターフェースを
使用してライフサイクル・イベントを listen します。
また、アプリケーションは、スレッド・セーフな方法で、必要なときにキャッシュを
リフレッシュできなければなりません。
OSGi で使用するすべての eXtreme Scale プラグインは、BackingMapPlugin または
ObjectGridPlugin インターフェースもそれぞれ実装する必要があります。
MapSerializerPlugin インターフェースなどの新しいプラグインでは、この実装が
実施されます。これらのインターフェースは、状態をプラグインに注入したり、プラグインのライフサイクルを
制御したりするための一貫性のあるインターフェースを eXtreme Scale ランタイム環境
と OSGi に提供します。
このタスクを使用して、ピア・プラグインが更新されたときに
通知するよう指定します。リスナー・インスタンスを生成するリスナー・ファクトリーを作成してもかまいません。
- ObjectGrid プラグイン・クラスを更新して、ObjectGridPlugin インターフェースを実装します。 このインターフェースは、eXtreme Scale がプラグインを初期化したり、ObjectGrid インスタンスを設定したり、
プラグインを破棄したりできるようにするメソッドを組み込みます。次のサンプル・コードを参照してください。
package com.mycompany;
import com.ibm.websphere.objectgrid.plugins.ObjectGridPlugin;
...
public class MyTranCallback implements TransactionCallback, ObjectGridPlugin {
private ObjectGrid og = null;
private enum State {
NEW, INITIALIZED, DESTROYED
}
private State state = State.NEW;
public void setObjectGrid(ObjectGrid grid) {
this.og = grid;
}
public ObjectGrid getObjectGrid() {
return this.og;
}
void initialize() {
// Handle any plug-in initialization here. This is called by
// eXtreme Scale, and not the OSGi bean manager.
state = State.INITIALIZED;
}
boolean isInitialized() {
return state == State.INITIALIZED;
}
public void destroy() {
// Destroy the plug-in and release any resources. This
// can be callsed by the OSGi Bean Manager or by eXtreme Scale.
state = State.DESTROYED;
}
public boolean isDestroyed() {
return state == State.DESTROYED;
}
}
- ObjectGrid プラグイン・クラスを更新して、ObjectGridLifecycleListener インターフェースを実装します。
次のサンプル・コードを参照してください。
package com.mycompany;
import com.ibm.websphere.objectgrid.plugins.ObjectGridLifecycleListener;
import com.ibm.websphere.objectgrid.plugins.ObjectGridLifecycleListener.LifecycleEvent;
...
public class MyTranCallback implements TransactionCallback, ObjectGridPlugin, ObjectGridLifecycleListener{
public void objectGridStateChanged(LifecycleEvent event) {
switch(event.getState()) {
case NEW:
case DESTROYED:
case DESTROYING:
case INITIALIZING:
break;
case INITIALIZED:
// Lookup a Loader or MapSerializerPlugin using
// OSGi or directly from the ObjectGrid instance.
lookupOtherPlugins()
break;
case STARTING:
case PRELOAD:
break;
case ONLINE:
if (event.isWritable()) {
startupProcessingForPrimary();
} else {
startupProcessingForReplica();
}
break;
case QUIESCE:
if (event.isWritable()) {
quiesceProcessingForPrimary();
} else {
quiesceProcessingForReplica();
}
break;
case OFFLINE:
shutdownShardComponents();
break;
}
}
...
}
- BackingMap プラグインを更新します。 BackingMap プラグイン・クラスを更新して、BackingMap インターフェースを実装します。
このインターフェースは、eXtreme Scale がプラグインを初期化したり、BackingMap インスタンスを設定したり、プラグインを破棄したりできるようにするメソッドを組み込みます。次のサンプル・コードを参照してください。
package com.mycompany;
import com.ibm.websphere.objectgrid.plugins.BackingMapPlugin;
...
public class MyLoader implements Loader, BackingMapPlugin {
private BackingMap bmap = null;
private enum State {
NEW, INITIALIZED, DESTROYED
}
private State state = State.NEW;
public void setBackingMap(BackingMap map) {
this.bmap = map;
}
public BackingMap getBackingMap() {
return this.bmap;
}
void initialize() {
// Handle any plug-in initialization here. This is called by
// eXtreme Scale, and not the OSGi bean manager.
state = State.INITIALIZED;
}
boolean isInitialized() {
return state == State.INITIALIZED;
}
public void destroy() {
// Destroy the plug-in and release any resources. This
// can be callsed by the OSGi Bean Manager or by eXtreme Scale.
state = State.DESTROYED;
}
public boolean isDestroyed() {
return state == State.DESTROYED;
}
}
- BackingMap プラグイン・クラスを更新して、BackingMapLifecycleListener インターフェースを実装します。 次のサンプル・コードを参照してください。
package com.mycompany;
import com.ibm.websphere.objectgrid.plugins.BackingMapLifecycleListener;
import com.ibm.websphere.objectgrid.plugins.BackingMapLifecycleListener.LifecycleEvent;
...
public class MyLoader implements Loader, ObjectGridPlugin, ObjectGridLifecycleListener{
...
public void backingMapStateChanged(LifecycleEvent event) {
switch(event.getState()) {
case NEW:
case DESTROYED:
case DESTROYING:
case INITIALIZING:
break;
case INITIALIZED:
// Lookup a MapSerializerPlugin using
// OSGi or directly from the ObjectGrid instance.
lookupOtherPlugins()
break;
case STARTING:
case PRELOAD:
break;
case ONLINE:
if (event.isWritable()) {
startupProcessingForPrimary();
} else {
startupProcessingForReplica();
}
break;
case QUIESCE:
if (event.isWritable()) {
quiesceProcessingForPrimary();
} else {
quiesceProcessingForReplica();
}
break;
case OFFLINE:
shutdownShardComponents();
break;
}
}
...
}
タスクの結果
ObjectGridPlugin または BackingMapPlugin インターフェースを実装することで、eXtreme Scale はプラグインの
ライフサイクルを正しいタイミングで制御できます。
ObjectGridLifecycleListener または BackingMapLifecycleListener インターフェースを実装すると、
プラグインは、関連付けられた ObjectGrid または BackingMap ライフサイクル・イベントのリスナーとして
自動的に登録されます。すべての ObjectGrid および BackingMap プラグインの
初期化が完了し、検索および使用が可能になったことをシグナル通知するときは INITIALIZING イベントが
使用されます。ObjectGrid がオンラインになり、イベントの処理を開始する
準備ができたことをシグナル通知するときは ONLINE イベントが使用されます。