intra-mart Accel Platform アクセスコンテキスト 拡張プログラミングガイド 第2版 2015-12-01

4.2. ライフサイクルの利用

4.2.1. 概要

アクセスコンテキストが有効な期間はライフサイクルが開始されてから終了するまでです。
ライフサイクル内でアクセスコンテキストを変更するためには、切替処理が必要になります。
切替処理についての詳細は、「 アクセスコンテキスト仕様書 」-「 切替 」を参照してください。
この章では、アクセスコンテキストの切替方法について、説明します。

注意

ライフサイクルの切替処理は、実行環境に依存する場合があります。
対象の実行環境以外で利用した場合、エラーが発生する可能性があります。

4.2.2. JavaEE開発モデルの場合

4.2.2.1. Lifecycle API を使用する

ライフサイクル内でアクセスコンテキストを切り替えるには、Lifecycle API を使用します。
アクセスコンテキストの切替方法には、「コンテキストスイッチ」と「コンテキストスタック」があります。
詳細は、「 Lifecycle クラスの APIドキュメント 」を参照してください。
また、 intra-mart Accel Platform で提供する標準アクセスコンテキストの利用方法については、以下のドキュメントも参照してください。

4.2.2.1.1. コンテキストスイッチを実行する

コンテキストスイッチを実行するためには、Lifecycle#switchTo() メソッドを使用してください。
// 環境情報の作成
final String resourceId = "sample.switch.resource.id"; // あらかじめ定義されたリソースID
final Object resourceObject = new Object(); // 指定したスイッチ処理で必要なリソース情報
final Resource resource = new Resource(resourceId, resourceObject);

// コンテキストスイッチの実行
final Lifecycle lifecycle = LifecycleFactory.getLifecycle();
lifecycle.switchTo(resource);
引数 説明
resource

以下の情報を設定した環境情報

  • あらかじめ定義されたリソースID
  • 指定したスイッチ処理で必要なリソース情報

4.2.2.1.2. コンテキストスタックを実行する

コンテキストスタックを実行するためには、Lifecycle#stack() メソッドを使用してください。
// 環境情報の作成
final String resourceId = "sample.stack.resource.id"; // あらかじめ定義されたリソースID
final Object resourceObject = new Object(); // 指定したスタック処理で必要なリソース情報
final Resource resource = new Resource(resourceId, resourceObject);

// コンテキストスタックの実行
final Lifecycle lifecycle = LifecycleFactory.getLifecycle();
lifecycle.stack(resource);
引数 説明
resource

以下の情報を設定した環境情報

  • あらかじめ定義されたリソースID
  • 指定したスタック処理で必要なリソース情報
スタック前のアクセスコンテキストは保存されており、スタック前のアクセスコンテキストに戻すには、Lifecycle#pop() メソッドを使用してください。
final Lifecycle lifecycle = LifecycleFactory.getLifecycle();
lifecycle.pop();

4.2.2.2. Lifecycle API をラップして API を作成する

Lifecycle API を利用した「コンテキストスイッチ」と「コンテキストスタック」の実行時は、 環境情報として、あらかじめ定義されたリソースIDの指定と、Object 型のリソース情報の指定が必要です。
特定のアクセスコンテキストの切替を目的とする場合は、Lifecycle API をラップした別の切替用 API を作成すると便利です。
以下のコードは、クライアントタイプを変更するための、 ClientTypeSwitcher API の実装です。
ClientTypeSwitcher API では、クライアントコンテキストの切替処理をラップしています。
Lifecycle API に引き渡す引数の情報をラッパークラスが隠すことで、アクセスコンテキストの切替が簡単になります。
// コンテキストスイッチのラッパーメソッド
public void switchTo(final String clientTypeId) {
    if (vaildChangeClientTypeId(clientTypeId)) {
        final HTTPContext httpContext = HTTPContextManager.getInstance().getCurrentContext();
        final HttpResource resource = new HttpResource(
                MultiDeviceResourceId.CLIENT_CHANGE,
                clientTypeId,
                httpContext.getRequest(),
                httpContext.getResponse()
        );
        LifecycleFactory.getLifecycle().switchTo(resource);
    }
}

// コンテキストスタックのラッパーメソッド
public void oneTimeSwitchTo(final String clientTypeId) {
    if (vaildChangeClientTypeId(clientTypeId)) {
        final HTTPContext httpContext = HTTPContextManager.getInstance().getCurrentContext();
        final HttpResource resource = new HttpResource(
                MultiDeviceResourceId.CLIENT_CHANGE_STACK,
                clientTypeId,
                httpContext.getRequest(),
                httpContext.getResponse()
        );
        LifecycleFactory.getLifecycle().stack(resource);
    }
}

4.2.3. スクリプト開発モデルの場合

4.2.3.1. Lifecycle API を使用する

ライフサイクル内でアクセスコンテキストを切り替えるには、Lifecycle API を使用します。
アクセスコンテキストの切替方法には、「コンテキストスイッチ」と「コンテキストスタック」があります。
詳細は、「 Lifecycle オブジェクトの APIドキュメント 」を参照してください。
また、 intra-mart Accel Platform で提供する標準アクセスコンテキストの利用方法については、以下のドキュメントも参照してください。

4.2.3.1.1. コンテキストスイッチを実行する

コンテキストスイッチを実行するためには、Lifecycle#switchTo() メソッドを使用してください。
// 環境情報の定義
var resourceId = "sample.switch.resource.id"; // あらかじめ定義されたリソースID
var resourceObject = new Object(); // 指定したスイッチ処理で必要なリソース情報

// コンテキストスイッチの実行
Lifecycle.switchTo(resourceId, resourceObject);
引数 説明
resourceId あらかじめ定義された環境情報のリソースID
resourceObject 指定したスイッチ処理で必要な環境情報のリソース情報

4.2.3.1.2. コンテキストスタックを実行する

コンテキストスタックを実行するためには、Lifecycle#stack() メソッドを使用してください。
// 環境情報の定義
var resourceId = "sample.stack.resource.id"; // あらかじめ定義されたリソースID
var resourceObject = new Object(); // 指定したスタック処理で必要なリソース情報

// コンテキストスタックの実行
Lifecycle.stack(resourceId, resourceObject);
引数 説明
resourceId あらかじめ定義された環境情報のリソースID
resourceObject 指定したスタック処理で必要な環境情報のリソース情報
スタック前のアクセスコンテキストは保存されており、スタック前のアクセスコンテキストに戻すには、Lifecycle#pop() メソッドを使用してください。
Lifecycle.pop();