J2EE関連の最新トピックをわかりやすく解説

J2EE Watch [9]


通信系・情報系サービスを融合する「SIP Servlet」



富士通株式会社
鈴木信吾
2006/4/22



 近年のIP電話の普及に伴い、音声通話やプレゼンスなどの通信系サービスはIPネットワーク上で提供することが一般的になりつつあります。読者の中にも、IP電話を利用したことがある方もいらっしゃると思います。

 音声を主体とする通信系サービスがIPネットワークに統合されたことにより、通信系サービスと情報系サービスを共通のインフラで提供することが可能になりました。またIP電話については、コスト削減のフェーズから付加価値による業務効率化のフェーズへ移行が始まっています。この動向に伴い、通信市場では情報と通信の融合をターゲットとしたアプリケーション基盤製品が続々と登場してきています。

 そして現在、情報系サービスと通信系サービスの融合を実現するアプリケーション基盤として注目されているのがSIP Servletです。SIP ServletはJCP(Java Community Process)によって策定されたJavaの標準仕様です。本稿ではSIP Servletの役割と特長について紹介しましょう。

VoIPを支えるSIP

 SIPはネットワーク上で、セッションの開始・更新・切断を制御するプロトコルです。IETF(Internet Engineering Task Force)のRFC 3261にて基本事項が規定されています。SIPを利用したサービスには、IP電話、プレゼンス、インスタントメッセージなど多岐にわたって展開されています。SIPの特徴を整理すると以下のようになります。

  • テキストベースの信号で理解しやすく、拡張性に優れている
  • セッション制御を実行するプロトコルであり、メディア依存性がない
  • SIPメッセージはリクエスト・レスポンス型で双方向性を持つ
図1 ユーザーAとユーザーBの通話におけるSIPメッセージの流れ


  SIPのメッセージはHTTPと類似しているためインターネットの世界で受け入れやすいこともあり、いまやVoIPの世界で標準テクノロジになりつつあります。SIPは音声や画像などを伝達するリアルタイムコミュニケーションに欠かせないプロトコルです。

JCPによって策定されたSIP Servlet

 アプリケーション実行環境であるJAIN(Java Advanced Integrated Network)などJavaに関する仕様は、Java有識者から構成されるJCP(Java Community Process)にて策定されています。JCPでは各Java仕様をJSR(Java Specifications Request)として策定し公開しています。SIP Servletについても、JAIN API規約の1つであり、JCPにてJSR 116として仕様が策定されました。

 SIP Servletとは、SIPという特定のプロトコルを扱うことが可能なServletコンテナと呼ばれるアプリケーション実行環境と実行環境上で動作するアプリケーション開発用のAPIを規定したものです。SIP Servletの仕様についてはhttp://jcp.org/aboutJava/communityprocess/final/jsr116/index.htmlからダウンロードすることができます。

 Servletコンテナでは、SIPメッセージ受信時にどのアプリケーションを起動したらよいか決定し、アプリケーションを起動させます。また、ライフサイクルに沿ったアプリケーションの管理やダイアログ/セッションなどのSIPに関する管理を実施します。Servletコンテナのおかげで、アプリケーション開発者はトランザクション制御などのロジックを考慮する必要はなく、SIPを用いたアプリケーションの開発が可能になります。

 下図はSIP Servletを実装したアプリケーションサーバの実現モデルの1つです。1つのServletコンテナ上にHTTP ServletとSIP Servletを配備することができます。このような実現モデルにより、HTTPとSIPの容易な連携サービスが可能となります。

図2 SIP Servletを実装したアプリケーションサーバの実現モデル


 ここで、「Servlet」と聞いて、HTTP Servletの構成をイメージされた方もいらっしゃるかと思います。ご想像のとおり、SIP ServletとHTTP Servletはアプリケーションの構成など、非常によく似ています。アプリケーションの呼び出し方はイベント通知型で、イベント通知を受けたアプリケーションが動作します。

図3 アプリケーションの呼び出しはイベント通知型


  HTTP Servletと違う点は、HTTPがリクストを受け付け、レスポンスを返送するサーバモデルであるのに対し、SIPではクライアント、サーバ、プロキシの各モデルに対応します。つまり、リクエストだけでなくレスポンスを受信し処理するモデルでもあるのです。

アプリケーション基盤におけるSIP Servlet

 通信系サービス向けのアプリケーション基盤では、前述したJavaのAPI(Application Program Interface)と実行環境であるJAINやテレコム向けアプリケーション基盤として提唱されるParlayなどがあります。これらさまざまなアプリケーション基盤が提唱されている中で、JAIN SIP、SIP Servlet、JAIN SLEE、Parlay/Parlay-Xの4つは特にピックアップされることが多いアプリケーション基盤です。各アプリケーション基盤では、プロトコル依存性や提供しているAPIが異なります。

図4 各アプリケーション基盤では、プロトコル依存性や提供しているAPIが異なる

 APIの抽象度を高めると、容易に理解できアプリケーション開発が容易になります。しかし、少し複雑なサービス制御や独自のSIPヘッダ・パラメータを意識した制御が必要なサービス開発では、現行のAPIでは制御できない、動作に必要なAPIが存在しないというケースが出てきます。逆に、APIの抽象度が低いとSIPメッセージに設定された独自ヘッダ・パラメータを自由に制御できますが、アプリケーション開発者はプロトコルの専門知識が必要となります。

 これらの抽象度と使いやすさの関係はトレードオフであり、利用者が提供・作成するアプリケーションに応じたサービス実行基盤の選定が重要になってきます。

 アプリケーション基盤の中で、SIP Servletを用いることのメリットは、以下のように整理できます。

  • HTTPとSIPの融合アプリケーション開発
    HTTP Servletと同じGenericServletの拡張であるため、HTTP Servletと高い親和性を持っています。また、異なるプロトコルセッションを取りまとめる仕組みを規定しているため、異プロトコル間の連携が容易です。

  • アプリケーション開発者の取り込み
    WebアプリケーションでHTTP Servletの開発経験者は膨大です。HTTP Servletの開発経験とSIPの基本知識があれば、SIP Servlet開発が容易であるため、HTTP Servlet開発経験者の取り込みが可能となります。

  • 既存ソフトウェア資産の有効活用
    HTTP ServletとSIP Servletを実装したアプリケーションサーバが登場しています。これにより、既存ソフトウェアに音声アプリケーションを容易にアドオンすることが可能となり、既存ソフトウェア資産を有効活用することが可能となります。

  • アプリケーション開発の容易性
    ダイアログやセッション管理はServletコンテナが実施します。アプリケーション開発者は、SIPのハンドリングのみ作成します。

SIP Servletアプリケーションの構造

 SIP Servletでアプリケーションを開発する場合、SipServletクラスに実装していくことになります。ここではSipServletクラスの役割、機能について簡単に紹介しましょう。

・SipServletクラス

  一般的にサーブレットは、Servletインターフェイスを実装するか、クラスを拡張してインターフェイスを実装しています。SIP ServletにおいてもSIP Servlet APIにおいてGenericServletクラスを継承するSipServletクラスを定義しています。SIP Servletを作成する場合、このSipServletクラスを継承したクラスを実装していきます。

図5 SipServletクラスを継承したクラスを実装

・SIP Servletのライフサイクル

  SIP Servletに初めてSIPメッセージがServletコンテナからイベント通知されるとき、Servletコンテナから1度だけinitメソッドがコールされます。initメソッドではSIP Servletアプリケーションで使用するリソースの初期化などを実施します。

 初回以降のイベント通知は、イベントごとにServletインターフェイスのserviceメソッドを通してコールされます。serviceメソッドでは受信したSIPメッセージを解析し、対応するdoXxxメソッドをコールします。SIP Servletアプリケーションの配備解除やServletコンテナを終了する際に、Servletコンテナからdestroyメソッドがコールされます。Destroyメソッドでは、SIP Servletアプリケーションで使用したリソースの回収処理などを実施します。

図6 SipServletのライフサイクル

・SIPメッセージのハンドリング

  SIPのメッセージはリクエスト・レスポンス型のメッセージで双方向性を持っています。従って、SIP Servletではリクエストのハンドリングだけでなく、レスポンスのハンドリングも可能になります。

 SipServletクラスはSIPメッセージのハンドリング用にdoXxxメソッドを定義しています。SIP ServletアプリケーションはdoXxxメソッドを実装することで、SIPメッセージのハンドリングを行います。リクエストハンドリングは、SIPリクエストのmethod名に対応したdoXxxメソッドを、レスポンスハンドリングは、SIPレスポンスのStatus Codeの範囲値に対応したdoXxxメソッドを用います。

・配備記述子

 アプリケーションは自分を呼び出してほしいSIPメッセージについて、配備記述子(Deployment Descriptor)に定義します。配備記述子はHTTP Servletのものとよく似ていますが、マッチングルールに使用されるservlet-mappingの部分がSIP固有のものとなっています。

 SIP Servletでは受信したメソッド名、リクエストURI、Fromヘッダ、Toヘッダの情報についてservlet-mappingに記載することができます。ServletコンテナではSIPリクエストを受信した際に、マッチングを行います。マッチングでは、各アプリケーションで記述されたservlet-mappingの内容に従って、呼び出すアプリケーションを決定します。

 ここまでの内容でSIP Servletの特長とその機能の概要を理解いただけたかと思います。すでにインターネットの世界で普及しているHTTP Servletとの親和性は大きな魅力であり、連携も容易であることからSIP Servletは情報系サービスと通信系サービスを融合するアプリケーション基盤として本命視されています。




Java Solution全記事一覧

 



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間