8.3.3. 完全および部分的ステート転送
インメモリまたは永続ステート転送が有効の場合は、キャッシュの使用方法に応じて完全または部分的なステート転送が異なるタイミングで実行されます。「完全な」ステート転送は、ツリー全体 (ルートノードとそれ以下のすべてのノード) に関連するステートの転送を意味します。「部分的な」ステート転送では、ツリーの一部 (ある FQN のノードとそれ以下のすべてのノード) のみが転送されます。
インメモリステート転送または永続ステート転送が有効な場合は、以下にタイミングでステート転送が実行されます。
- 初期ステート転送。 キャッシュが最初に起動された時に実行される (
start()
メソッドの処理の一部として実行) 完全なステート転送になります。 ステートは最も長い期間稼働しているキャッシュインスタンスから取得されます。[1]ステートの受信または統合で問題が発生した場合は、 キャッシュが起動しません。以下の場合は初期ステート転送が実行されません。- キャッシュの
InactiveOnStartup
プロパティはtrue
です。 このプロパティはリージョンベースのマーシャリングと併用されます。 - バディレプリケーションが使用されます。バディレプリケーションを使用したステート転送の詳細については、以下を参照してください。
- リージョンアクティベーション後の部分的ステート転送。 リージョンベースマーシャリングが使用されると、 アプリケーションはキャッシュに特定のクラスローダーを登録する必要があります。 このクラスローダーは、 キャッシュの特定リージョン (サブツリー) のステートをアンマーシャルするために使用されます。登録後、 関連するサブツリーのステートの部分ステート転送を開始する
cache.getRegion(fqn, true).activate()
をアプリケーションが呼び出します。 最初に、 クラスタ内の最も古いキャッシュインスタンスに要求を行います。 このインスタンスがステートを返さない場合は、 あるインスタンスがステートを提供するまで (またはすべてのインスタンスが要求を受けるまで) 各インスタンスへ順番に要求を行います。通常、 リージョンベースのマーシャリングが使用された場合、 キャッシュのInactiveOnStartup
プロパティがtrue
に設定されます。 これにより、 初期ステート転送が抑制され、 転送されたステートを非シリアル化できないため初期ステート転送に失敗します。 - バディレプリケーション。 バディレプリケーションが使用された場合は、 初期ステート転送が無効になります。 キャッシュインスタンスがクラスタに参加すると、 キャッシュインスタンスは 1 つまたは複数の他のインスタンスのバディになり、 1 つまたは複数の他のインスタンスはそのバディになります。 インスタンスがバックアップを提供する新しいバディを持っていることを確認すると、 インスタンスは現在のステートを新しいバディにプッシュします。 この新しいバディへのステートのプッシュは「プル」のアプローチ (受信側がステートを要求し受信する) に基づいた他形式のステート転送とは若干異なります。 ただし、 ステートを準備および統合するプロセスは同じです。バディグループ形成時のステートの「プッシュ」は、
InactiveOnStartup
プロパティがfalse
に設定されている場合にのみ実行されます。true
に設定されている場合、 グループの複数のメンバーにアプリケーションがリージョンをアクティベートした時のみバディ間のステート転送が実行されます。リージョンのアクティベート呼び出し後の部分的ステート転送も、 バディレプリケーションの場合と若干異なります。 あるキャッシュインスタンスから部分的なステートを要求し、 インスタンスが応答するまですべてのインスタンスを試すのではなく、 バディレプリケーションではリージョンを有効化するインスタンスはバックアップとして機能する各インスタンスから部分的なステートを要求します。