ヘッダをスキップ
Oracle® WebLogic Communication Services 開発者ガイド
11g リリース 1 (11.1.1)
B55506-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

2 コンバージド アプリケーションの開発

この章では、OWLCS を使用して HTTP と SIP のコンバージド アプリケーションを開発する方法について説明します。以下の節で構成されています。

2.1 コンバージド アプリケーションの概要

コンバージド アプリケーション」では、SIP プロトコルの機能と HTTP または Java EE のコンポーネントを組み合わせることで、統合的な通信サービスを実現します。たとえば、オンラインの Push-to-Talk アプリケーションで、ユーザがショッピング カート内の商品について質問するために音声コールを開始するという機能を実現できます。この音声コールのために開始される SIP セッションは、ユーザの HTTP セッションに関連付けられています。そのため、音声コールに答える従業員は、ユーザのショッピング カートの中身や購入履歴を見ることができます。

アプリケーション アーカイブ (.EAR file) へ Java EE コンポーネント (EJB など) を利用するコンバージド アプリケーションをパッケージ化する必要があります。SIP および HTTP プロトコルを利用するコンバージド アプリケーションは、sip.xml および web.xml 両方のデプロイメント記述子ファイルを含む 1 つの SAR または WAR ファイルでパッケージする必要があります。オプションで、1 つの EAR ファイル内で別々の SAR および WAR コンポーネントにコンバージド アプリケーションの SIP および HTTP Servlet をパッケージできます。

コンバージド アプリケーションで使用される HTTP セッションと SIP セッションには、共通のアプリケーション セッション オブジェクトを通じてプログラム的にアクセスできます。HTTP セッションをアプリケーション セッションに関連付けるための SIP Servlet API が用意されています。

2.2 コンバージド アプリケーションのアセンブルとパッケージ化

SIP Servlet 仕様では、コンバージド アプリケーションのアセンブルに関する要件と制約が詳しく規定されています。SIP Servlet 仕様の内容を簡潔にまとめると、次のようになります。

2.3 SIP セッションと HTTP セッションの設定

図 2-1 に示すように、OWLCS コンテナにデプロイされるコンバージド アプリケーションは必ずユニークな SipApplicationSession を持ち、その中に 1 つまたは複数の SipSession オブジェクトと ConvergedHttpSession オブジェクトを含めることができます。

図 2-1 コンバージド アプリケーションのセッション

コンバージド アプリケーションのセッション
「図 2-1 コンバージド アプリケーションのセッション」の説明

javax.servlet.SipApplicationSession の API により、そのアプリケーションの SipApplicationSession 内のすべての使用可能セッションを反復処理することができます。コンバージド アプリケーションを開発する場合、ユニーク アプリケーション セッションで URL をエンコーディングするメソッドも用意されています。

以前のリリースでは、OWLCS は、以下の処理を行うためのメソッドを提供するように基本 SIP Servlet API を拡張します。

この機能は、SIP Servlet API バージョン 1.1 の一部として直接提供され、独自の API (com.bea.wcp.util.Sessions) は、非推奨になりました。表 2-0 は、非推奨になったメソッドの代わりに使用する SIP Servlet API を示します。 詳細については、SIP Servlet v1.1 API JavaDoc を参照してください。

表 2-1 非推奨 com.bea.wcp.util.Sessions のメソッド

非推奨になったメソッド (com.bea.wcp.util.Sessions) 置き換えメソッド 説明

getApplicationSession

javax.servlet.sip.SipSessionsUtil.

getApplicationSession

指定したセッション ID に基づいて SipApplicationSession オブジェクトを取得します。

getApplicationSessionsByCallId

なし。

指定した呼び出し ID に関連付けられている SipApplicationSession オブジェクト群のイテレータを取得します。

createHttpSession

なし。

代わりに、HttpSession をConvergedHttpSession に キャストできます。

setApplicationSession

javax.servlet.sip.ConvergedHttpSession.

getApplicationSession

HTTP セッションを既存の SipApplicationSession に関連付けます。

removeApplicationSession

なし。

既存の SipApplicationSession から HTTP セッションを削除します。

getEncodeURL

javax.servlet.sip.ConvergedHttpSession.

encodeURL

既存の HTTP セッション オブジェクトの jsessionid を使用して HTTP URL をエンコードします。



注意 :

com.bea.wcp.util.Sessions API は、下位互換性のためにのみ提供されています。すべての新しい開発に対して SIP Servlet API を使用します。OWLCS は com.bea.wcp.util.Sessions API および JSR 289 コンバージェンス API を混在するコンバージド アプリケーションをサポートしません。

具体的には、非推奨 Sessions.getApplicationSessionsByCallId(String callId) メソッドは、既存の SipApplicationSession オブジェクトに初期リクエストを関連付けられるためにセッション キーに基づくの対象メソッドを使用する v1.1 SIP Servlet で使用できません。対象メカニズムの詳細については、SIP Servlet Specification v1.1 (http://jcp.org/en/jsr/detail?id=289) の節 15.11.2 を参照してください。


2.3.1 SipApplicationSession の変更

Replicated ドメインを使用している場合は、SIP Servlet から SipApplicationSession オブジェクトを変更するときに、OWLCS によって自動的に同時実行制御が行われます。つまり、SIP Servlet から SipApplicationSession オブジェクトを変更するときに、そのオブジェクトが他のアプリケーションによって同時に変更されるのを防ぐために、SIP コンテナによって自動的にオブジェクトがロックされます。

HTTP Servlet などの非 SIP アプリケーションでは、アプリケーションの呼状態を変更する前に、その呼状態を明示的にロックする必要があります。また、単一の SIP サーブレットが他の呼状態オブジェクトを変更する必要がある場合 (会議開催サブレットは複数の呼を結合する場合など) にも必要です。

アプリケーション セッション オブジェクトへの同時アクセスの管理を容易にするために、OWLCS では、標準の SipApplicationSession オブジェクトを拡張した com.bea.wcp.sip.WlssSipApplicationSession が用意されています。さらに、セッションへの変更をカプセル化するために、2 つのインタフェース com.bea.wcp.sip.WlssAction および com.bea.wcp.sip.WlssAsynchronous Action が追加されています。これらの API を使用すると、SIP コンテナの働きにより、WlssAction および WlssAsynchronousAction オブジェクト内に含まれているすべてのビジネス ロジックが、関連付けられている SipApplicationSession インスタンスのロックされたコピーに対して確実に適用されます。以下の節で、それぞれのインタフェースについて説明します。

2.3.1.1 同期アクセス

トランザクションおよび同期によってセッション属性の読み取りおよび更新を行う必要があるアプリケーションでは、WlssAction API を使用する必要があります。WlssAction は、アクション期間の明示的なロックをセッションで取得します。例 2-1「WlssAction API を使用するサンプル コード」は、この API を使用する例を示します。

例 2-1 WlssAction API を使用するサンプル コード

final SipApplicationSession appSession = ...;
WlssSipApplicationSession wlssAppSession = (WlssSipApplicationSession) appSession;
wlssAppSession.doAction(new WlssAction() {
       public Object run() throws Exception {
         // ここにすべてのビジネス ロジックを追加します。         appSession.setAttribute("counter", latestCounterValue);
         sipSession.setAttribute("currentState", latestAppState);
         // SIP コンテナはアプリケーション セッションが
         // ロックされている間に実行メソッドが呼び出されることを確認します。
         return null;
       }
});

WlssAction API は関連するセッションで排他的なロックを取得するため、アクション内で別のアプリケーション セッション属性を変更しようとするとデッドロックが発生する可能性があります。

2.3.1.2 非同期アクセス

ロックされた SipApplicationSession のコンテキスト内で異なる SipApplicationSession を更新する必要があるアプリケーションでは、WlssAsynchronousAction API を使用して非同期的な更新を実行できます。この API は、複数のアプリケーションが同じ SipApplicationSession の属性を同時に更新する必要がある場合の競合を軽減します。例 2-2「WlssAsynchronousAction API を使用するサンプル コード」は、この API を使用する例を示します。

この API を使用してアプリケーションをコンパイルするには、MIDDLEWARE_HOME/server/lib/wlss/wlssapi.jar と MIDDLEWARE_HOME/server/lib/wlss/sipservlet.jar を含める必要があります。

例 2-2 WlssAsynchronousAction API を使用するサンプル コード

SipApplicationSession sas1 = req.getSipApplicationSession(); // SipApplicationSession1 はすでにコンテナでロックされています
  // 処理をスケジューリングする別の SipApplicationSession を取得します
  WlssSipApplicationSession wlssSipAppSession = SipSessionsUtil.getApplicationSessionById(conferenceAppSessionId);
  // 処理はアプリケーション セッションで非同期的に実行されます
  appSession.doAsynchronousAction(new WlssAsynchronousAction() {
    Serializable run(SipApplicationSession appSession) {
      // ここにすべてのビジネス ロジックを追加します。
      int counter = appSession.getAttribute("counter");
      ++ counter;
      appSession.setAttribute("counter", counter);
      return null;
    }
});

appSession に対する処理を非同期的に実行することで、ネストされたロックおよび関連するデッドロックのシナリオを防ぐことができます。

2.4 コンバージド アプリケーションのサンプルの使用

OWLCS には、com.bea.wcp.util.Sessions API を使用したサンプルのコンバージド アプリケーションが含まれています。すべてのソース コード、デプロイメント記述子、およびサンプルのビルド ファイルは、OWLCS_HOME\samples\sipserver\examples\src\convergence にインストールされています。サンプルをビルドして実行する方法については、サンプル ディレクトリの readme.html ファイルを参照してください。