この章では、SIP アプリケーションのプログラミングについて説明します。以下の節で構成されています。
この節では、OWLCS SipServletMessage
インタフェースおよびコンフィグレーション パラメータを使用して、SIP メッセージ ヘッダ フォーマットを制御する方法について説明します。
ワイヤレス ネットワークで動作するアプリケーションでは、メッセージのサイズを縮小して帯域を節約するために、SIP ヘッダのサイズを制限できます。JSR 289 で提供される SipServletMessage.setHeaderForm()
メソッドを使用すると、アプリケーション開発者は所定のヘッダの値に長いまたは圧縮されたフォーマットを設定できます。
JSR 289 で提供された SipServletMessage
API の機能の 1 つは、setHeaderForm
メソッドを使用して全体の SIP メッセージに対して長いヘッダまたは圧縮ヘッダ フォーマットを設定可能にすることです。
SipServletMessage
に加え、OWLCS には、システムで生成されたすべてのヘッダに対して SIP ヘッダ フォーマットを制御できるコンテナ全体のコンフィグレーション パラメータが用意されています。このシステム全体のパラメータを SipServletMessage.setHeaderForm
および SipServletMessage.setHeader
とともに使用してヘッダ フォーマットをさらにカスタマイズすることができます。
表 3-1 は、SIP 仕様 (http://www.ietf.org/rfc/rfc3261.txt
) に説明されている圧縮ヘッダの省略形を定義しています。追加ヘッダを説明する仕様には、圧縮ヘッダの省略形が含まれる可能性もあります。
メッセージで使用されるヘッダ フォーマットの割り当てや取得には、setHeaderForm
および getHeaderForm
のような getter/setter メソッドの組み合わせを使用します。これらのメソッドは、HeaderForm
オブジェクトを割り当てたり返したりします。このオブジェクトは、ヘッダ フォーマットを説明する単純な列挙オブジェクトです。
COMPACT
— メッセージのすべてのヘッダに圧縮フォーマットを使用するように強制します。この動作は、『コンフィグレーション リファレンス マニュアル』の「use-compact-form」に説明した「force compact」のコンテナ全体のコンフィグレーション値と同じです。
LONG
- メッセージのすべてのヘッダに対して長いフォーマットを使用するように強制します。この動作は、『コンフィグレーション リファレンス マニュアル』の「use-compact-form」に説明した「force long」のコンテナ全体のコンフィグレーション値と同じです。
DEFAULT
- use-compact-form に設定されたコンテナ全体のコンフィグレーション値にヘッダ フォーマットを指定します。
SipServletResponse.setHeaderForm
は SipServletMessage.setHeader
とコンテナ レベルのコンフィグレーション パラメータ use-compact-form と組み合わせて使用することができます。
ヘッダ フォーマットは、ヘッダ、メッセージ、および SIP サーブレット コンテナ レベルで設定することができます。表 3-1 は、SipServletMessage.setHeaderForm
でさまざまなコンテナ コンフィグレーションおよびメッセージ レベルが設定されている場合に、SipServletMessage.setHeader
で新しいヘッダを追加するときのヘッダ フォーマットを示しています。
表 3-2 ヘッダを追加するときの API の動作
SIP サーブレット コンテナ ヘッダのコンフィグレーション ( |
.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 サーブレット コンテナ ヘッダのコンフィグレーション ( |
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」 |
この節では、SIP メッセージ ボディで指定されている間接的なコンテンツを扱うことのできる SIP Servlet の開発方法について説明します。
SIP メッセージのボディで提供するデータは、SIP メッセージ ボディに直接含めることも、間接的に含めることもできます。後者の場合は、URL コンテンツを示す HTTP URL とメタデータを指定するという方法を使用します。メッセージ ボディのコンテンツを間接的に指定するという方法は、主に次の状況で使用されます。
メッセージ ボディに含まれるデータの量が多い場合。この場合は、コンテンツの間接化を行うことで、大きなデータを (別の接続またはプロトコルを使用して) SIP ネットワークの外部に移動させることができます。
帯域幅に制約があるアプリケーションの場合。この場合は、コンテンツの間接化を行うことで、メッセージ ボディを取得する必要があるかどうかをアプリケーションがメタデータに基づいて判断できるようになります (メッセージ ボディの取得は、アプリケーションのパフォーマンスや応答時間を低下させる可能性があります)。
OWLCS には、SIP メッセージ内に指定されている間接的なコンテンツを取り扱うための単純な API が用意されています。
OWLCS のコンテンツ間接化 API を使用すると、SIP メッセージでコンテンツの間接化が行われているかどうかをすばやく判断したり、間接的なコンテンツに関連付けられているすべてのメタデータを簡単に取得したりできます。この基本 API は、ユーティリティ クラス com.bea.wcp.sip.util.ContentIndirectionUtil
と、コンテンツ メタデータのアクセスに使用するインタフェース com.bea.wcp.sip.util
から成ります。
SIP Servlet では、このユーティリティ クラスを使用することで、間接的なコンテンツを含んでいる SIP メッセージを識別したり、コンテンツ メタデータを表す ICParsedData
オブジェクトを取得したりできます。ICParsedData
オブジェクトには、さまざまなメタデータ属性を返す単純なゲッター メソッドが用意されています。
コンテンツの間接化の詳細は、RFC 4483 にあります。
コンテンツ間接化 API の追加のドキュメントについては、『Oracle Fusion Middleware WebLogic Communication Services API Reference』を参照してください。
この節では、OWLCS の SipServletSnmpTrapRuntimeMBean
を使用して SIP サーブレット内から SNMP トラップを生成する方法について説明します。
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 インスタンスの名前を送信します。
SipServletSnmpTrapRuntimeMBean
を取得するには、呼び出し側の SIP サーブレットがサーブレット コンテキストから MBean ルックアップを実行できなければなりません。この機能を有効化するには、OWLCS 管理者の role-name
エントリを sip.xml
デプロイメント記述子内の security-role
と run-as
ロール要素に割り当てる必要があります。例 3-1 に sip.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>
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 は、例 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()); } }