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

戻る
戻る
 
次へ
次へ
 

3 SIP プロトコルのプログラミング

この章では、SIP アプリケーションのプログラミングについて説明します。以下の節で構成されています。

3.1 SIP メッセージの圧縮および長いヘッダ フォーマットの使用

この節では、OWLCS SipServletMessage インタフェースおよびコンフィグレーション パラメータを使用して、SIP メッセージ ヘッダ フォーマットを制御する方法について説明します。

3.1.1 ヘッダ フォーマット API とコンフィグレーションの概要

ワイヤレス ネットワークで動作するアプリケーションでは、メッセージのサイズを縮小して帯域を節約するために、SIP ヘッダのサイズを制限できます。JSR 289 で提供される SipServletMessage.setHeaderForm() メソッドを使用すると、アプリケーション開発者は所定のヘッダの値に長いまたは圧縮されたフォーマットを設定できます。

JSR 289 で提供された SipServletMessage API の機能の 1 つは、setHeaderForm メソッドを使用して全体の SIP メッセージに対して長いヘッダまたは圧縮ヘッダ フォーマットを設定可能にすることです。

SipServletMessage に加え、OWLCS には、システムで生成されたすべてのヘッダに対して SIP ヘッダ フォーマットを制御できるコンテナ全体のコンフィグレーション パラメータが用意されています。このシステム全体のパラメータを SipServletMessage.setHeaderForm および SipServletMessage.setHeader とともに使用してヘッダ フォーマットをさらにカスタマイズすることができます。

3.1.2 圧縮ヘッダの概要

表 3-1 は、SIP 仕様 (http://www.ietf.org/rfc/rfc3261.txt) に説明されている圧縮ヘッダの省略形を定義しています。追加ヘッダを説明する仕様には、圧縮ヘッダの省略形が含まれる可能性もあります。

表 3-1 圧縮ヘッダの省略形

ヘッダの名 (長いフォーマット) 圧縮フォーマット

Call-ID

i

Contact

m

Content-Encoding

e

Content-Length

l

Content-Type

c

From

f

Subject

s

Supported

k

To

t

Via

v


3.1.3 WlssSipServletMessage でのヘッダ フォーマットの割り当て

メッセージで使用されるヘッダ フォーマットの割り当てや取得には、setHeaderForm および getHeaderForm のような getter/setter メソッドの組み合わせを使用します。これらのメソッドは、HeaderForm オブジェクトを割り当てたり返したりします。このオブジェクトは、ヘッダ フォーマットを説明する単純な列挙オブジェクトです。

  • COMPACT — メッセージのすべてのヘッダに圧縮フォーマットを使用するように強制します。この動作は、『コンフィグレーション リファレンス マニュアル』の「use-compact-form」に説明した「force compact」のコンテナ全体のコンフィグレーション値と同じです。

  • LONG - メッセージのすべてのヘッダに対して長いフォーマットを使用するように強制します。この動作は、『コンフィグレーション リファレンス マニュアル』の「use-compact-form」に説明した「force long」のコンテナ全体のコンフィグレーション値と同じです。

  • DEFAULT - use-compact-form に設定されたコンテナ全体のコンフィグレーション値にヘッダ フォーマットを指定します。

SipServletResponse.setHeaderFormSipServletMessage.setHeader とコンテナ レベルのコンフィグレーション パラメータ use-compact-form と組み合わせて使用することができます。

3.1.4 API およびコンフィグレーションの動作の概要

ヘッダ フォーマットは、ヘッダ、メッセージ、および SIP サーブレット コンテナ レベルで設定することができます。表 3-1 は、SipServletMessage.setHeaderForm でさまざまなコンテナ コンフィグレーションおよびメッセージ レベルが設定されている場合に、SipServletMessage.setHeader で新しいヘッダを追加するときのヘッダ フォーマットを示しています。

表 3-2 ヘッダを追加するときの API の動作

SIP サーブレット コンテナ ヘッダのコンフィグレーション (use-compact-form 設定)

.SIPServletMessage

setHeaderForm の設定

SipServletMessage.

setHeader の値

取得したヘッダ

COMPACT

DEFAULT

「Content-Type」

「Content-Type」

COMPACT

DEFAULT

「c」

「c」

COMPACT

COMPACT

「Content-Type」

「c」

COMPACT

COMPACT

「c」

「c」

COMPACT

LONG

「Content-Type」

「Content-Type」

COMPACT

LONG

「c」

「Content-Type」

LONG

DEFAULT

「Content-Type」

「Content-Type」

LONG

DEFAULT

「c」

「c」

LONG

COMPACT

「Content-Type」

「c」

LONG

COMPACT

「c」

「c」

LONG

LONG

「Content-Type」

「Content-Type」

LONG

LONG

「c」

「Content-Type」

FORCE_COMPACT

DEFAULT

「Content-Type」

「c」

FORCE_COMPACT

DEFAULT

「c」

「c」

FORCE_COMPACT

COMPACT

「Content-Type」

「c」

FORCE_COMPACT

COMPACT

「c」

「c」

FORCE_COMPACT

LONG

「Content-Type」

「Content-Type」

FORCE_COMPACT

LONG

「c」

「Content-Type」

FORCE_LONG

DEFAULT

「Content-Type」

「Content-Type」

FORCE_LONG

DEFAULT

「c」

「Content-Type」

FORCE_LONG

COMPACT

「Content-Type」

「c」

FORCE_LONG

COMPACT

「c」

「c」

FORCE_LONG

LONG

「Content-Type」

「Content-Type」

FORCE_LONG

LONG

「c」

「Content-Type」


表 3-1 は、コンテナ コンフィグレーション値が異なる場合に、WlssSipServletResponse.setUseHeaderForm でヘッダ フォーマットを設定したときのシステム ヘッダ フォーマットを示しています。

表 3-3 システム ヘッダに対する API の動作

SIP サーブレット コンテナ ヘッダのコンフィグレーション (use-compact-form 設定)

SipServletMessage.

setHeaderForm の設定

取得した コンタクト ヘッダ

COMPACT

DEFAULT

「m」

COMPACT

COMPACT

「m」

COMPACT

LONG

「Contact」

LONG

DEFAULT

「Contact」

LONG

COMPACT

「m」

LONG

LONG

「Contact」

FORCE_COMPACT

DEFAULT

「m」

FORCE_COMPACT

COMPACT

「m」

FORCE_COMPACT

LONG

「Contact」

FORCE_LONG

DEFAULT

「Contact」

FORCE_LONG

COMPACT

「m」

FORCE_LONG

LONG

「Contact」


3.2 SIP サーブレットにおけるコンテンツの間接化の使用

この節では、SIP メッセージ ボディで指定されている間接的なコンテンツを扱うことのできる SIP Servlet の開発方法について説明します。

3.2.1 コンテンツの間接化の概要

SIP メッセージのボディで提供するデータは、SIP メッセージ ボディに直接含めることも、間接的に含めることもできます。後者の場合は、URL コンテンツを示す HTTP URL とメタデータを指定するという方法を使用します。メッセージ ボディのコンテンツを間接的に指定するという方法は、主に次の状況で使用されます。

  • メッセージ ボディに含まれるデータの量が多い場合。この場合は、コンテンツの間接化を行うことで、大きなデータを (別の接続またはプロトコルを使用して) SIP ネットワークの外部に移動させることができます。

  • 帯域幅に制約があるアプリケーションの場合。この場合は、コンテンツの間接化を行うことで、メッセージ ボディを取得する必要があるかどうかをアプリケーションがメタデータに基づいて判断できるようになります (メッセージ ボディの取得は、アプリケーションのパフォーマンスや応答時間を低下させる可能性があります)。

OWLCS には、SIP メッセージ内に指定されている間接的なコンテンツを取り扱うための単純な API が用意されています。

3.2.2 コンテンツ間接化 API の使用

OWLCS のコンテンツ間接化 API を使用すると、SIP メッセージでコンテンツの間接化が行われているかどうかをすばやく判断したり、間接的なコンテンツに関連付けられているすべてのメタデータを簡単に取得したりできます。この基本 API は、ユーティリティ クラス com.bea.wcp.sip.util.ContentIndirectionUtil と、コンテンツ メタデータのアクセスに使用するインタフェース com.bea.wcp.sip.util から成ります。

SIP Servlet では、このユーティリティ クラスを使用することで、間接的なコンテンツを含んでいる SIP メッセージを識別したり、コンテンツ メタデータを表す ICParsedData オブジェクトを取得したりできます。ICParsedData オブジェクトには、さまざまなメタデータ属性を返す単純なゲッター メソッドが用意されています。

3.2.3 追加情報

コンテンツの間接化の詳細は、RFC 4483 にあります。

コンテンツ間接化 API の追加のドキュメントについては、『Oracle Fusion Middleware WebLogic Communication Services API Reference』を参照してください。

3.3 アプリケーション コードからの SNMP トラップ生成

この節では、OWLCS の SipServletSnmpTrapRuntimeMBean を使用して SIP サーブレット内から SNMP トラップを生成する方法について説明します。

3.3.1 概要

OWLCS では、実行時 MBean として SipServletSnmpTrapRuntimeMBean が含まれています。これを使用することで、アプリケーション開発者は SNMP トラップを簡単に生成できます。OWLCS の MIB には、アプリケーションによって生成されるトラップ用に予約された 7 個の新しい OID が含まれます。それぞれの OID はアプリケーションがトラップに割り当てる重要度に対応しており、重要度の最も低いものから順番に並べると次のようになります。

  • Info

  • Notice

  • Warning

  • Error

  • Critical

  • Alert

  • Emergency

アプリケーションからトラップを生成するには、SipServletSnmpTrapRuntimeMBean のインスタンスを取得して、目的のトラップの重要度に対応するメソッドを実行します (sendInfoTrap()sendWarningTrap()sendErrorTrap()sendNoticeTrap()sendCriticalTrap()sendAlertTrap()sendEmergencyTrap())。各メソッドにはパラメータが 1 つあり、このパラメータには生成するトラップ メッセージの文字列値を指定します。

この方法で SNMP トラップを生成すると、OWLCS は自動的に、サーブレット名、アプリケーション名、および呼び出し側サーブレットに関連付けられている OWLCS インスタンスの名前を送信します。

3.3.2 SipServletSnmpTrapRuntimeMBean へのアクセスの要件

SipServletSnmpTrapRuntimeMBean を取得するには、呼び出し側の SIP サーブレットがサーブレット コンテキストから MBean ルックアップを実行できなければなりません。この機能を有効化するには、OWLCS 管理者の role-name エントリを sip.xml デプロイメント記述子内の security-rolerun-as ロール要素に割り当てる必要があります。例 3-1sip.xml ファイルのサンプルを、強調表示した必須ロール要素とともに示します。

例 3-1 sip.xml のロール要素の例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sip-app
   PUBLIC "-//Java Community Process//DTD SIP Application 1.0//EN"
   "http://www.jcp.org/dtd/sip-app_1_0.dtd">
<sip-app>
  <display-name>My SIP Servlet</display-name>
  <distributable/>
  <servlet>
    <servlet-name>myservlet</servlet-name>
    <servlet-class>com.mycompany.MyServlet</servlet-class>
    <run-as>
      <role-name>weblogic</role-name>
    </run-as>
  </servlet>
  <servlet-mapping>
    <servlet-name>myservlet</servlet-name>
    <pattern>
      <equal>
        <var>request.method</var>
        <value>INVITE</value>
      </equal>
    </pattern>
  </servlet-mapping>
  <security-role>
    <role-name>weblogic</role-name>
  </security-role>
</sip-app>

3.3.3 SipServletSnmpTrapRuntimeMBean への参照の取得

SNMP トラップを発生する SIP サーブレットはすべて、最初に SipServletSnmpTrapRuntimeMBean への参照を取得する必要があります。例 3-2 に MBean を取得するメソッドのサンプル コードを示します。

例 3-2 SipServletSnmpTrapRuntimeMBean にアクセスするメソッドの例

public SipServletSnmpTrapRuntimeMBean getServletSnmpTrapRuntimeMBean() {
    MBeanHome localHomeB = null;
    SipServletSnmpTrapRuntimeMBean ssTrapMB = null;

    try
    {
      Context ctx = new InitialContext();
      localHomeB = (MBeanHome)ctx.lookup(MBeanHome.LOCAL_JNDI_NAME);
      ctx.close();
    } catch (NamingException ne){
      ne.printStackTrace();
    }

    Set set = localHomeB.getMBeansByType("SipServletSnmpTrapRuntime");
    if (set == null || set.isEmpty()) {
      try {
        throw new ServletException("Unable to lookup type 'SipServletSnmpTrapRuntime'");
      } catch (ServletException e) {
        e.printStackTrace();
      }
    }
    ssTrapMB = (SipServletSnmpTrapRuntimeMBean) set.iterator().next();
    return ssTrapMB;
}

3.3.4 SNMP トラップの生成

例 3-3 は、例 3-2 のメソッドを使用して、SIP INVITE への応答時に SIP サーブレットが MBean インスタンスを使用して SNMP トラップを生成する方法を示しています。

例 3-3 SNMP トラップの生成

public class MyServlet extends SipServlet {
  private SipServletSnmpTrapRuntimeMBean sipServletSnmpTrapMb = null;

  public MyServlet () {
  }

  public void init (ServletConfig sc) throws ServletException {
    super.init (sc);
    sipServletSnmpTrapMb = getServletSnmpTrapRuntimeMBean();
  }

  protected void doInvite(SipServletRequest req) throws IOException {
    sipServletSnmpTrapMb.sendInfoTrap("Rx Invite from " + req.getRemoteAddr() + "with call id" + req.getCallId());
  }
}