この章では、アプリケーションで、Oracle WebLogic ServerのDiameterプロトコル実装に基づいてDiameter Shプロファイル・サービスおよびプロファイル・サービスAPIを使用する方法について説明します。内容は次のとおりです。
IMS仕様では、Shプロファイル・サービスを、アプリケーション・サーバー(AS)の機能とHome Subscriber Server (HSS)の間、または複数のIMSアプリケーション・サーバーの間の通信手段として定義しています。アプリケーション・サーバーは基本的にShプロファイル・サービスを次の2つの目的で使用します。
HSSに格納されているユーザーのデータの問合せまたは更新のため
HSS上のユーザーのデータが変更されたときに通知をサブスクライブして受信するため
アプリケーション・サーバーから使用できるユーザー・データには、アプリケーション・サーバー上のサービスによって定義されるもの(リポジトリ・データ)と、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サーブレット内でプロファイル・リスナー・インタフェースを実装します。
Oracle WebLogic Server SIP Containerには、Diameter Shプロファイル・サービスのプロバイダが含まれます。今後のリリースでは、IMS仕様で定義された追加のインタフェースをサポートするために、いくつかのプロバイダが提供される可能性があります。このプロファイル・サービスAPIを使用するアプリケーションは、新しいプロバイダが使用可能になったときに、そのプロバイダを使用できます。
Diameterサポートの設定方法については、ネットワーク・リソースの構成のDiameter Shクライアント・ノードとリレー・エージェントの構成に関する項を参照してください。
Oracle WebLogic Server SIP Containerには、SIPサーブレットからサブスクライバのプロファイル・データを問合せまたは変更したり、変更されたプロファイル・データについて通知を受信するようにサブスクリプションを管理したりするときに使用できる、単純なプロファイル・サービスAPIが用意されています。このAPIを使用すると、SIPサーブレットからShプロバイダ・アプリケーションを通じて明示的にユーザー・プロファイル・ドキュメントをリクエストできます。ShプロバイダはXMLドキュメントを返し、SIPサーブレットは標準的なDOMテクニックを使って、このローカル・ドキュメント内のプロファイル・データを読み取ったり変更したりできます。ローカル・ドキュメントに加えた変更は、「put」操作後にHSSに反映されます。
ドキュメント・セレクタ・キーは、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
は、リクエストするデータ参照のタイプを指定します。一部のデータ参照リクエストでは、uri
とreference_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には次のいずれかを指定します。
|
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/ |
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. } }
IMS Shインタフェースにより、アプリケーションはサブスクライバのプロファイル・データが変更されたときに通知を自動的に受信できます。Oracle WebLogic Server SIP Containerには、プロファイル・データのサブスクリプションを管理するための便利なAPIが用意されています。SIPサーブレットで通知を受信するには、com.bea.wcp.profile.ProfileListener
インタフェースを実装します。このインタフェースは1つのupdate
メソッドから成り、サーブレットをサブスクライブしているプロファイルに変更が生じると、このメソッドが自動的に呼び出されます。同じサーブレットからプロファイル情報を変更した場合には、通知は送信されません(たとえばユーザーが自分でプロファイル・データを変更した場合など)。
注意: レプリケートされた環境では、Diameterリレー・ノードは、プロファイルの更新がサブスクライブされているエンジン層サーバーに通知を直接プッシュしようとします。そのエンジン層サーバーが使用可能でない場合は、エンジン層クラスタの別のサーバーが選択されて通知を受信します。このモデルが機能するのは、セッション情報がエンジン層ではなくSIPデータ層に格納されているからです。 |
サブスクライブしたプロファイル・データのコールバックを受信するには、SIPサーブレットは以下の手順に従う必要があります。
com.bea.wcp.profile.ProfileListener
を実装します。
com.bea.wcp.profile.ProfileService
ヘルパー・クラスでsubscribe
メソッドを使用して1つ以上のサブスクリプションを作成します。
sip.xml
のlistener
要素を使用して、それ自体をリスナーとして登録します。
「ProfileListenerの実装」は、ProfileListener
を実装してsusbscribe
メソッドを使用する方法を示しています。有効なリスナーの実装があることに加えて、サーブレットはsip.xml
デプロイメントの記述子ファイルでそれ自体をリスナーとして宣言する必要があります。たとえば、次のようなlistener
要素の宣言を追加する必要があります。
<listener> <lisener-class>com.mycompany.MyLisenerServlet</listener-class> </listener>
実際のサブスクリプションは、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()); } }