ヘッダーをスキップ
Oracle® WebLogic Server SIP Container開発者ガイド
11g リリース1(11.1.1)
B61430-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

9 プロファイル・サービスAPIの使用

この章では、アプリケーションで、Oracle WebLogic ServerのDiameterプロトコル実装に基づいてDiameter Shプロファイル・サービスおよびプロファイル・サービスAPIを使用する方法について説明します。内容は次のとおりです。

9.1 プロファイル・サービスAPIおよびShインタフェースのサポートの概要

IMS仕様では、Shプロファイル・サービスを、アプリケーション・サーバー(AS)の機能とHome Subscriber Server (HSS)の間、または複数のIMSアプリケーション・サーバーの間の通信手段として定義しています。アプリケーション・サーバーは基本的にShプロファイル・サービスを次の2つの目的で使用します。

アプリケーション・サーバーから使用できるユーザー・データには、アプリケーション・サーバー上のサービスによって定義されるもの(リポジトリ・データ)と、HSS上で管理されているユーザーのIMSプロファイル・データのサブセットがあります。Shインタフェースの仕様3GPP TS 29.328は、Shを通じて問合せの実行や更新ができるIMSプロファイル・データを定義します。Shプロファイル・サービスからアクセス可能なすべてのユーザー・データは、3GPP TS 29.328で定義されたスキーマを持つXMLドキュメントとして示されます。

IMSのShプロファイル・サービスは、Oracle WebLogic Server SIP ContainerのDiameterベース・プロトコルをサポートするプロバイダとして実装されています。このプロバイダは、Shアプリケーション仕様で定義されているDiameterコマンド・コードの透過的な生成と応答を行います。より高レベルのプロファイル・サービスAPIを使用すると、SIPサーブレットでXMLドキュメント・オブジェクト・モデル(DOM)を使ってユーザー・プロファイル・データをXMLドキュメントとして管理できます。変更されたプロファイル・データに関するサブスクリプションと通知を管理するには、SIPサーブレット内でプロファイル・リスナー・インタフェースを実装します。

図9-1 プロファイル・サービスAPIとShプロバイダの実装

プロバイダの実装
「図9-1 プロファイル・サービスAPIとプロバイダの実装」の説明

Oracle WebLogic Server SIP Containerには、Diameter Shプロファイル・サービスのプロバイダが含まれます。今後のリリースでは、IMS仕様で定義された追加のインタフェースをサポートするために、いくつかのプロバイダが提供される可能性があります。このプロファイル・サービスAPIを使用するアプリケーションは、新しいプロバイダが使用可能になったときに、そのプロバイダを使用できます。

9.2 Shインタフェース・プロバイダの有効化

Diameterサポートの設定方法については、ネットワーク・リソースの構成のDiameter Shクライアント・ノードとリレー・エージェントの構成に関する項を参照してください。

9.3 プロファイル・サービスAPIの概要

Oracle WebLogic Server SIP Containerには、SIPサーブレットからサブスクライバのプロファイル・データを問合せまたは変更したり、変更されたプロファイル・データについて通知を受信するようにサブスクリプションを管理したりするときに使用できる、単純なプロファイル・サービスAPIが用意されています。このAPIを使用すると、SIPサーブレットからShプロバイダ・アプリケーションを通じて明示的にユーザー・プロファイル・ドキュメントをリクエストできます。ShプロバイダはXMLドキュメントを返し、SIPサーブレットは標準的なDOMテクニックを使って、このローカル・ドキュメント内のプロファイル・データを読み取ったり変更したりできます。ローカル・ドキュメントに加えた変更は、「put」操作後にHSSに反映されます。

9.4 アプリケーション管理下のプロファイル・データに関するドキュメント・セレクタ・キーの作成

ドキュメント・セレクタ・キーは、Diameterインタフェースを通じて取得するXMLドキュメントを識別し、protocol://uri/reference_type[/access_key]という形式を使用します。プロファイル・データを管理するサーブレットは、ドキュメント・セレクタ・キーを使用してプロファイル・サービスからSh XMLドキュメントを明示的に取得した後で、DOMを使用してこのドキュメントを処理します。

セレクタのprotocolの部分は、ドキュメントの取得に使用するDiameterインタフェース・プロバイダを識別します。Sh XMLドキュメントには、sh://プロトコルの指定が必要です。

Shドキュメント・セレクタの場合、2番目の要素uriは、通常はプロファイル・データが取得されるユーザーのUser-IdentityまたはPublic-Identityに対応します。LocationInformationまたはUserStateタイプのShデータ参照をリクエストする場合は、目的のユーザーのUser-IdentityまたはMSISDNをURI値に指定できます。

表9-2に、リクエストできるShデータ参照のタイプと、その際に指定するURI値を示します。使用可能なデータ参照と関連する参照タイプの詳細は、3GPP TS 29.328を参照してください。

表9-1 Shデータ参照で使用できるURI値

Shデータ参照番号 データ参照タイプ ドキュメント・セレクタに指定するURI値

0

RepositoryData

User-IdentityまたはPublic-Identity

10

IMSPublicIdentity


11

IMSUserState


12

S-CSCFName


13

InitialFilterCriteria


14

LocationInformation

User-IdentityまたはMSISDN

15

UserState


17

Charging information

User-IdentityまたはPublic-Identity

17

MSISDN



ドキュメント・セレクタの最後の要素reference_typeは、リクエストするデータ参照のタイプを指定します。一部のデータ参照リクエストでは、urireference_typeだけを指定します。その他に、アクセス・キーを使用するShリクエストもあります。その場合は、ドキュメント・セレクタ・キーの3番目の要素として、ドキュメント・セレクタ・キー内で定義されているAttribute-Value Pair (AVP)の値を指定します。

表9-2は、各タイプのShデータ参照リクエストで必要なドキュメント・セレクタ・キー要素を示しています。

表9-2 Shデータ参照リクエストで使用するドキュメント・セレクタ要素のまとめ

データ参照タイプ 必要なドキュメント・セレクタ要素 ドキュメント・セレクタの例

RepositoryData

sh://uri/reference_type/Service-Indication

sh://sip:user@oracle.com/RepositoryData/Call Screening/

IMSPublicIdentity

sh://uri/reference_type/[Identity-Set]

Identity-Setには次のいずれかを指定します。

  • All-Identities

  • Registered-Identities

  • Implicit-Identities

sh://sip:user@oracle.com/IMSPublicIdentity/Registered-Identities

IMSUserState

sh://uri/reference_type

sh://sip:user@oracle.com/IMSUserState/

S-CSCFName

sh://uri/reference_type

sh://sip:user@oracle.com/S-CSCFName/

InitialFilterCriteria

sh://uri/reference_type/Server-Name

sh://sip:user@oracle.com/InitialFilterCriteria/www.oracle.com/

LocationInformation

sh://uri/reference_type/(CS-Domain | PS-Domain)

sh://sip:user@oracle.com/LocationInformation/CS-Domain/

UserState

sh://uri/reference_type/(CS-Domain | PS-Domain)

sh://sip:user@oracle.com/UserState/PS-Domain/

Charging information

sh://uri/reference_type

sh://sip:user@oracle.com/Charging information/

MSISDN

sh://uri/reference_type

sh://sip:user@oracle.com/MSISDN/


9.5 作成されたドキュメント・キーによるプロファイル・データ管理

Oracle WebLogic Server SIP Containerには、プロファイル・データ・ドキュメントを簡単に取得するためのcom.bea.wcp.profile.ProfileServiceというヘルパー・クラスがあります。getDocument()メソッドは、作成されたドキュメント・キーを受け取り、読取り専用のorg.w3c.dom.Documentオブジェクトを返します。ドキュメントを変更するには、コピーを作成して編集した後で、変更後のドキュメントとキーを引数としてputDocument()メソッドに渡します。


注意:

getDocument()の実行時にOracle WebLogic Server SIP Containerインスタンス上でDiameter Shクライアント・ノード・サービスが使用可能になっていないと、プロファイル・サービスから「No registered provider for protocol」という例外がスローされます。

Oracle WebLogic Server SIP Containerは、サービス・メソッドの呼出しの間、プロファイル・サービスから返されたドキュメントをキャッシュします(たとえば、doRequest()メソッドを呼び出した場合)。サービス・メソッドが同じプロファイル・ドキュメントを何度もリクエストする場合は、後続のリクエストはキャッシュから提供され、HSSを再度問い合せません。

例9-1は、プロファイル・データを取得して変更するSIPサーブレットのサンプルを示しています。

例9-1 Profileserviceを使用してユーザー・プロファイル・データの取得と書込みを行うサンプル・サーブレット

package demo;
import com.bea.wcp.profile.*;
import javax.servlet.sip.SipServletRequest;
import javax.servlet.sip.SipServlet;
import org.w3c.dom.Document;
import java.io.IOException;
public class MyServlet extends SipServlet {
      private ProfileService psvc;
      public void init() {
        psvc = (ProfileService) getServletContext().getAttribute(ProfileService.PROFILE_SERVICE);
      }
      protected void doInvite(SipServletRequest req) throws IOException {
        String docSel = "sh://" + req.getTo() + "/IMSUserState/";
        // Obtain and change a profile document.
        Document doc = psvc.getDocument(docSel); // Document is read only.
        Document docCopy = (Document) doc.cloneNode(true);
        // Modify the copy using DOM.
        psvc.putDocument(docSel, docCopy); // Apply the changes.
      }
}

9.6 ProfileListenerによるプロファイル・データのモニター

IMS Shインタフェースにより、アプリケーションはサブスクライバのプロファイル・データが変更されたときに通知を自動的に受信できます。Oracle WebLogic Server SIP Containerには、プロファイル・データのサブスクリプションを管理するための便利なAPIが用意されています。SIPサーブレットで通知を受信するには、com.bea.wcp.profile.ProfileListenerインタフェースを実装します。このインタフェースは1つのupdateメソッドから成り、サーブレットをサブスクライブしているプロファイルに変更が生じると、このメソッドが自動的に呼び出されます。同じサーブレットからプロファイル情報を変更した場合には、通知は送信されません(たとえばユーザーが自分でプロファイル・データを変更した場合など)。


注意:

レプリケートされた環境では、Diameterリレー・ノードは、プロファイルの更新がサブスクライブされているエンジン層サーバーに通知を直接プッシュしようとします。そのエンジン層サーバーが使用可能でない場合は、エンジン層クラスタの別のサーバーが選択されて通知を受信します。このモデルが機能するのは、セッション情報がエンジン層ではなくSIPデータ層に格納されているからです。

9.6.1 リスナー実装の前提条件

サブスクライブしたプロファイル・データのコールバックを受信するには、SIPサーブレットは以下の手順に従う必要があります。

  • com.bea.wcp.profile.ProfileListenerを実装します。

  • com.bea.wcp.profile.ProfileServiceヘルパー・クラスでsubscribeメソッドを使用して1つ以上のサブスクリプションを作成します。

  • sip.xmllistener要素を使用して、それ自体をリスナーとして登録します。

「ProfileListenerの実装」は、ProfileListenerを実装してsusbscribeメソッドを使用する方法を示しています。有効なリスナーの実装があることに加えて、サーブレットはsip.xmlデプロイメントの記述子ファイルでそれ自体をリスナーとして宣言する必要があります。たとえば、次のようなlistener要素の宣言を追加する必要があります。

<listener>
   <lisener-class>com.mycompany.MyLisenerServlet</listener-class>
</listener>

9.6.2 ProfileListenerの実装

実際のサブスクリプションは、com.bea.wcp.profile.ProfileServiceヘルパー・クラスのsubscribeメソッドを使って管理されます。subscribeメソッドには、現在のSipApplicationSessionと、モニター対象となるプロファイル・データ・ドキュメントのキーを指定します。「アプリケーション管理下のプロファイル・データに関するドキュメント・キーの作成」を参照してください。

サブスクリプションを取り消すには、ProfileSubscription.cancel()を呼び出します。保留状態のサブスクリプションは、アプリケーション・セッションの終了時に自動的に取り消されます。

例9-2は、ProfileListenerインタフェースを実装したサーブレットのサンプル・コードを示しています。

例9-2 ProfileListenerインタフェースを実装したサーブレットのサンプル

package demo;
    import com.bea.wcp.profile.*;
    import javax.servlet.sip.SipServletRequest;
    import javax.servlet.sip.SipServlet;
    import org.w3c.dom.Document;
    import java.io.IOException;
    public class MyServlet extends SipServlet implements ProfileListener {
      private ProfileService psvc;
      public void init() {
        psvc = (ProfileService) getServletContext().getAttribute(ProfileService.PROFILE_SERVICE);
      }
      protected void doInvite(SipServletRequest req) throws IOException {
        String docSel = "sh://" + req.getTo() + "/IMSUserState/";
        // Subscribe to profile data.
        psvc.subscribe(req.getApplicationSession(), docSel, null);
}
      public void update(ProfileSubscription ps, Document document) {
        System.out.println("IMSUserState updated: " + ps.getDocumentSelector());
      }
    }