SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

エンタープライズJavaアプリケーションのサーバーレスポンスを圧縮する

圧縮技術を実装し、ネットワークの遅延を避ける

ダウンロード サンプルソース (55.6 KB)

圧縮の実装

 本稿では、Java EEアプリケーションで圧縮を実行する2種類の方法について説明します。

  • WebLogic圧縮フィルタ
  • PlanetJ圧縮フィルタ

 どちらの方法も圧縮対象となるレスポンスの内容には関係なく、レスポンス全体に対して処理を行います。言い換えれば、これらの方法はフィルタとして機能し、XMLレスポンス、文字列レスポンス、さらにはバイナリレスポンスを圧縮するために利用できるということです(図1)。

図1 クライアントがリクエストを送出:リクエストを送出するクライアントは、メッセージが圧縮されていることを理解し、それを正しく展開できなければならない
図1 クライアントがリクエストを送出:リクエストを送出するクライアントは、メッセージが圧縮されていることを理解し、それを正しく展開できなければならない

 この2つの方法は同様の構成になっています。両方ともgzipアルゴリズムを用いてデータを圧縮します。この圧縮アルゴリズムはすべてJavaで実行されるため、ネイティブ実装よりも遅い可能性があります(実際のJARファイルは本稿のダウンロードサンプルに含まれています)。

WebLogic圧縮フィルタ

 この圧縮フィルタをWebアプリケーションにセットアップするには、JARライブラリファイルをプロジェクトにインポートし、web.xml内にフィルタマッピングを追加したうえで、圧縮の対象となるすべてのリソース(.txt、.log、.html、Webサービス用の/wsdl/*など)をマッピングします。以下に簡単な手順を示します。

  1. ダウンロードコードに含まれる「weblogicx-gzip.jar」ファイルをWARファイルの「WEB-INF/lib」ディレクトリに追加します。
  2. WEB-INF/web.xmlに示されているように、gzipフィルタをweb.xmlに登録します。
  3. <filter>
      <filter-name>GZIPFilter</filter-name>
      <filter-class>weblogicx.servlet.gzip.filter.GZIPFilter</filter-class>
    </filter>
    
  4. フィルタを次のようにマッピングします(サンプルファイル中のweb.xmlにも例が含まれています)。
  5. <filter-mapping>
       <filter-name>GZIPFilter</filter-name>
       <url-pattern>/*.html</url-pattern>
       <url-pattern>/service/wsdl/*</url-pattern>
    </filter-mapping>
    

PlanetJ圧縮フィルタ

 この圧縮フィルタをセットアップする方法は、WebLogic圧縮フィルタの場合と同様です。JARファイルをインクルードし、web.xmlを更新します。PlanetJフィルタ用のweb.xmlの設定例を以下に示します。

<filter>
      <filter-name>CompressingFilter</filter-name>
      <filter-class>com.planetj.servlet.filter.compression.CompressingFilter</filter-class>
      <init-param>
         <param-name>debug</param-name>
         <param-value>true</param-value>
      </init-param>
      <init-param>
         <param-name>jakartaCommonsLogger</param-name>
         <param-value>com.planetj.servlet.filter.compression.CompressingFilter</param-value>
      </init-param>
</filter>
<filter-mapping>
      <filter-name>CompressingFilter</filter-name>
      <url-pattern>/service/wsdl/*</url-pattern>
</filter-mapping>

soapUIを使ってWebサービスの圧縮をテストする

 テストのために、圧縮フィルタを使用してWebサービスのレスポンスを圧縮してみました。SOAPエンベロープ内のXMLも圧縮対象としました。圧縮されたWebサービスのテストには、ロイヤルティーフリーのWebサービス解析/テストツールであるsoapUIを使用しました(図2)。

図2 soapUIの環境設定:soapUIツールではグローバルな環境設定が可能
図2 soapUIの環境設定:soapUIツールではグローバルな環境設定が可能

 soapUIは、圧縮されたメッセージを受信してそれを自動的に展開する機能など、多数の機能を備えています。展開を無効にする設定も可能です。この設定は、クライアント側で処理を行わない純粋なネットワーク伝送時間を計測するときに役立ちます(図3)。

図3 soapUIで展開を無効に設定:テストでは受信したレスポンスの展開を無効にするようにsoapUIを設定した
図3 soapUIで展開を無効に設定:テストでは受信したレスポンスの展開を無効にするようにsoapUIを設定した

 soapUIによるテストの結果は、両方のツールの圧縮効果が同じであることを示しています。すなわち、非圧縮入力に対する圧縮出力の比率はどちらの方法でもまったく同じでした。これは、両方のアルゴリズムが同じであることが理由だと思われます。ただ興味深いことに、PlanetJ圧縮フィルタはWebLogicフィルタよりも圧縮速度が速いようです。このため、一定時間当たりのリクエスト/レスポンスの処理量ではPlanetJが上回る結果となりました。10分間のテストの実行結果を次の表に示します。

図4 テスト実行結果
図4 テスト実行結果

圧縮技術実装の必要性

 クライアント/サーバ間通信のための新しいAPIの登場によって迅速な開発と堅牢なアプリケーションの作成が可能になる一方で、膨大な量のメッセージがネットワーク上を流れるという問題が起きるおそれがあります。この問題に対処するには、本稿で説明したような圧縮技術などを実装する必要があります。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Vlad Kofman(Vlad Kofman)

ウォールストリート有数の企業でエンタープライズレベルのプロジェクトに携わる。また、米国政府の防衛関連の仕事も手がけている。特に関心を寄せているのは、オブジェクト指向プログラミング方法論、UI、デザインパターン。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4396 2009/09/28 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー