public void setSessionContext(javax.ejb.SessionContext ctx) { mySessionCtx = ctx; try { // cache various references. InitialContext ic = new InitialContext(); bookHome = (PartitionManager)ic.lookup(PartitionManager.JNDI_NAME); } catch(Exception e) { throw new EJBException(e); } }例の使用法について詳しくは、サンプル・プログラムを参照してください。
この メソッドには 3 つのシグニチャーがあり、いずれも、 アプリケーション区画を表す PartitionDefinition インスタンスを作成するときに使用します。 このメソッドは多重定義されているため、目的の動作に応じて適切なメソッドを 選択してください。
PartitionDefinition createPartitionDefinition(String partitionName)
PartitionDefinition createPartitionDefinition(String partitionName,
String partitionClass,
PartitionScope scope)
PartitionDefinition createPartitionDefinition(String partitionName,
String partitionClass,
PartitionScope scope,
Map attributemap)
map put() API に最初に挿入される値は HA マネージャー・キーであり、2 番目に挿入される値は そのキーの対となる HA マネージャー値です。
public PartitionDefinition[] getPartitions() { String names = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; PartitionDefinition[] rc = new PartitionDefinition[names.length()]; for(int i = 0; i < names.length(); ++i) { Map testMap = new HashMap(); testMap.put(“custom-attrib", "samplevalue"); testMap.put("activateOn", Integer.toString(i%3)); // have 3 servers, balance at start rc[i] = ivRuntime.createPartitionDefinition(names.substring(i, i + 1), "MapExamle", PartitionScope.K_NODE, testMap); testMap = null; } logger.trace(RASITraceEvent.TYPE_LEVEL1, this, "getPartitions", "Returning partitions", rc); return rc; }
この例では、属性が 2 つあるマップを作成しています。 どの区画でも同じ値 (custom-attrib) になる HA マネージャー・キー属性と、 名前が activateOn で値が 0-2 のストリングになる値です。また、 ポリシー・サポートを使用して、開始値ごとにポリシーを作成し、区画 3 つごとに 優先サーバー・ポリシーが固有になるようにしています。 このアプローチについて詳しくは、ポリシーのセクションを参照してください。
String[] getPartitions()
このメソッドを呼び出すと、 デプロイ時に管理者が決めたアプリケーション名を取得できます。 このストリングを区画の名前に使用すれば、その区画をクラスター内で固有のものにする ことができます (ただし、デプロイされたアプリケーション名は WebSphere クラスター内で 固有のものである必要があります)。
String getApplicationName()
区画の作成時にこれを使用する場合、 区画化 J2EE アプリケーションにストリングの長さができるかぎり短い名前を付けてデプロイすることをお勧めします。 その名前が HA マネージャー・ランタイム全体で使用されるからです。このメソッドは、バージョン区画参照でよく使用されます。 同じクラスターに同じ区画化 J2EE アプリケーションを存在させることができます (それぞれ異なる名前でインストールされているにすぎません)。 各区画は、例えば PartitionA ではなく Appv2r2.PartitionA という名前で 呼び出すことができます。 このようにして、クラスター内で Appv2r1.PartitionA と Appv2r2.PartitionAh を同時に活動状態に することができます。各アプリケーションの要求は、それぞれが準拠するバージョン宛に送付されます。 これは、この問題への 1 つのアプローチにすぎません。
void addPartition(PartitionDefinition name)
あるクラスター・メンバーに区画が追加されると、同じ区画がすべてのクラスター・メンバーにも 自動的に非同期に追加されます。 デフォルトのクラスター・スコープ・ポリシーを使用している場合、要求を 受け取ったクラスター・メンバーで区画が活動状態になるのが一般的です。ただし、 必ずそうなることが保証されているわけではありません。 また、クラスターでの区画の活動化は分散機能です。 このため、この API から制御が戻ってから実際に区画が活動状態になるまでには 多少の遅延時間が発生します。 これは、プログラマーが責任を負うべき問題です。
サンプルの WPFKeyBasedPartition には、この API の使用例があります。
このメソッドを呼び出すと、 区画を動的に削除できます。 その区画がいずれかのクラスター・メンバーで現在活動状態であれば、 非活動状態になります。 そして、オンラインのすべてのクラスター・メンバーから削除されます。
void removePartition(String name)
クラスターでの区画の非活動化は分散機能です。このため、この API から制御が戻ってから実際に区画が非活動状態になるまでには多少の遅延時間が発生します。これは、プログラマーが責任を負うべき問題です。永続エラーではなく一時エラーが疑われる場合、プログラマーは disablePartition() API の 使用を検討してください。この場合、ポリシー・メカニズムを使用すると、 区画を再始動させてはいけないのか、別のクラスター・メンバーで再始動できるのかを 判断できます。
区画を動的に 使用不可にできます。 このメソッドを呼び出すと、現在のクラスター・メンバー上の区画が使用不可になります。 また、wpfadmin コマンドでも同じことを行うことができます。
void removePartition(String name)
このメソッドを呼び出すと、区画は非活動状態になるか、またはその区画をホスト可能な別のクラスター・メンバー上で即時に活動状態になります。区画が非活動状態になるかどうかは、現在のポリシー設定によって決まりますが、デフォルトでは他にクラスター・メンバーが存在すればそのメンバー上で活動状態になります。区画が自動的に活動状態に戻らない場合は、wpfadmin コマンドを使用して、そのメンバーを使用可能にすることができます。ただし、その区画を再度使用可能にする前に、管理者はログに目を通し、何らかの処置が必要かどうかを確認してください。アプリケーションは、このメソッドを呼び出し、 その呼び出し前にできる限りクリーンな状態にしておくことができるため、partitionUnloadEvent(...) は呼び出されません。
このメソッドを呼び出すと、 アクティブ区画に関する問題を示すことができます。 これにより、HA マネージャーは重大度パラメーターの値に従って対処できます。このメソッドは、 将来の利用のために予約されており、現時点ではインプリメントされていません。 disablePartition() を参照して、修正処置を実行してください。
このメソッドを呼び出すと、 トランザクションがどの区画でどのくらいの応答時間で完了したかが報告されます。 このメソッドは通常、同期 IIOP 要求ではなく、非同期メソッドで作業要求を 受け取るようにしているときに使用します。
void reportTransactionComplete(String partitionName, long responseTime_ms)
サンプルの WPFKeyBasedPartitionSample には、この API の使用例があります。
void setHttpPartitionManager(HttpPartitionManagerInterface manager)
WPF PMI には、responseTime という統計が含まれています。これは、 特定の区画のために実行されたトランザクションの応答時間とその数を測定するためのものです。 応答時間は、ユーザー・アプリケーションによって収集されます。 ユーザー・アプリケーションにより、com.ibm.websphere.wpf.PartitionManager インターフェースの reportTransactionComplete メソッドが呼び出されて、PMI 統計が更新されます。
/** * This should be called to inform the runtime when a transaction/operation * completes on this partition. This is used for records how many * transactions per seconds are being executed per partition. * @param partitionName the name of the partition. * @param responseTime_ms the response time for the transaction. * @throws IllegalStateException If the calling application has no partition handler bean */ void reportTransactionComplete(String partitionName, long responseTime_ms)
PartitionManager.reportTransactionComplete は、区画化ステートレス・セッション Bean (PSSB) で呼び出すことができます。ベスト・プラクティスは、まずトランザクション時間を計算してから、この API を使用して トランザクション時間を報告することです。 次に例を示します。メソッド buy は、WPFKeyBasedPartitionSample アプリケーションの WPFKeyBasedPartition Bean のトランザクションをシミュレートするメソッドです。
/** * A buy method. This method does nothing now except report the transaction * completion. The transaction takes a random value ranging from 0 ms to 1000ms. * * @param partitionName * @return the partition name */ public String buy(String partitionName) { String serverName = AdminServiceFactory.getAdminService().getNodeName() +"/"+AdminServiceFactory.getAdminService().getProcessName(); ivManager.reportTransactionComplete(partitionName, (long) (1000 * Math.random())); logger.trace( RASITraceEvent.TYPE_LEVEL1, this, "buy", "The method called at " + serverName + "." + partitionName); return "partiton=" + partitionName + ",server=" + serverName; }
あるアプリケーション・サーバーの特定の区画に対して 初めて PartitionManager.reportTransactionComplete を呼び出すと、アプリケーション名とセッション EJB 名でグループ化された PMI モジュールが その区画用に作成されます。 例えば、アプリケーション名が app1 で、セッション EJB 名が session1 の場合、PMI モジュールは app1#session1 でグループ化されます。詳しくは、PMI パスのセクションで説明しています。
responseTime 統計の目的は、平均応答時間、最小応答時間、最大応答時間、 応答時間の二乗の合計といった統計事実を計算することです。 これらの統計データにアクセスするには、wpfadmin コマンド、wsadmin コマンド、または MBean を使用して PMI データを照会します。
Related concepts
区画化機能フレームワーク・プログラミング・モデル