BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース 非同期のWebサービスにAxis2を使用

非同期のWebサービスにAxis2を使用

Apache Web Service Wiki(サイト・英語)のStack Comparison(source)によると、現在Apache Axis 1.xとAxis2とMetro@GlassFishとOracle Application Server 10Gはクライアントとサーバ上で非同期性を提供しているそうだ。

Apache Axis2(サイト・英語)はJavaかもしくはCを使用したWebサービスの呼び出しと実装を可能にするオープンソースWebサービスである。またAxis2の重要機能 はRajith Attapattu氏(source)が説明しているように同期性と非同期性の相互作用を提供する能力である。

非同期と同期の相互作用に対するサポートは両方のスタイルとも使用ケースが広くあるので、Webサービスにおいて重要な条件となります。Axis2は、トランスポート層において同じトランスポートかもしくは異なるトランスポートを介してレスポンスを非同期に許容することによってこの柔軟性を提供しています。例えば、もしリクエストがHTTPを介して入ってきて、プロセスが非同期に行われていたらその返答はHTTPを介して送られるか、もしくはJMSのような全く異なるトランスポートを利用することもできます。

Eran Chinthaka氏(サイト・英語)の記事"Axis2で非同期のWebサービスを開発しよう(source)"において、彼はクライアントとサーバサイドで非同期のAPIを使用する例をいくつか提供している。

Axis2を使用してWebサービスを非同期に呼び出す方法が二つある。最初に説明されている方法はノンブロッキングAPIを活用する方法である。

ノンブロッキングAPIをクライアントに提供すると、そのリクエストをSOAPエンジンに渡すことができ他の作業を続けることができます。エンジンがサーバから返答を得た後にSOAPエンジンによって告知され、クライアントが提供するコールバックオブジェクトがあります。このアプローチは特にGUIを伴う相互作用アプリケーションに実用的です。

以前のバージョンのAxis2でコールバック(source)と呼ばれていたクラスは、非同期メッセージかもしくはポーリングメカニズム用のコールバックメカニズムとして使用することができる。このクラスはAxis2 1.3においては廃止されていて、AxisCallback(source)と呼ばれる簡易なインターフェースによって置き換えられた。この新たなインターフェースは非同期のサービスの呼び出しの間に細かいアラートを可能にするが、以前コールバッククラスで見受けられたポーリングメカニズムは提供していない。

クライアントサイドからWebサービスを非同期に呼び出す二つ目の方法はトランスポートレベルによるものである。Eran氏はAxis2によて提供されているトランスポートを下記のように説明している。

Webサービス呼び出しにおいて使用され得る全てのトランスポートは、大きく二つのタイプの呼び出しにカテゴライズされます。
  • 一方向のトランスポートはメッセージの送信もしくは受信のためにチャンネルを提供する。
  • 双方向のトランスポートは同じチャンネルを使用してメッセージを送信、受信することができる。
クライアントには他にもリクエストレスポンス作用のためのオプションがあります。最も簡単な方法はHTTPのような双方向のトランスポートを使用することです。でもこのアプローチはトランスポートレベルの非同期性を使用しません。クライアントはまた二つの一方向トランスポートか、もしくは二つの双方向トランス ポートを使用することもできます。例えば、メッセージを送るのにSMTPチャンネルを使用し、もう一つのSMTPチャンネルを返答のメッセージを受け取るのに使用することができます。同時にリクエストを送るためにHTTPチャンネルを使用し、メッセージが送られた後にそれを閉じ、その返答を受け取るために異なるHTTPチャンネルを使用することができます。しかしこのアプローチをうまく活かすには、メッセージの相関メカニズムが必要となります。Apache Axis2はメッセージ相関のためにWS-Addressing仕様を使用している。

Axis2はトランスポートメカニズムの使用をシンプルにする。デベロッパが双方向トランスポートを可能にするために必要なものはクライアントにuseSeparateListenerフラッグを設定することである。 

クライアントサイドに非同期性を提供する事に加え、Apache Axis2はサーバサイドにも非同期性を提供する。標準のSOAPエンジンは一般的にリクエストを受け取り同じスレッド上で全てに返答する。クライアントサイドにおいて同じような理由で、プロセスをし、サーバ上のリクエスト非同期性に返答するのにかなり使えるのである。 

Axis2はMEPの世話をするメッセージレシーバーを採用し、そのメッセージをリクエストプロセスロジックかもしくはサービス実装に手渡します。同期の呼び出しの間にメッセージレシーバーはサービス実装クラス(サービス実装がJava言語内で書かれたことを想定して)内で適切なメソッドを呼び出し、その返答を同じスレッド内で送信します。でも非同期の呼び出しの間にこのメッセージレシーバーはサービスを呼び出し告知をクライアントに送るために、新たなスレッドを始めます。この新たなスレッドはレスポンスをクライアントに送り、サービス実装クラスから返答を得る責任を負います。

サーバ上で非同期性を可能にするにはそれを簡易化する二つの方法があり、一つは適切なフラッグを用いてWSDLジェネレータを使用し、もう一つはAbstractInOutAsyncMessageReceiver(source)を使用するためにservices.xmlを設定することである。

Eran Chinthaka氏は記事において下記のように結論を下している。

非同期の呼び出しはWebサービスユーザとWebサービスを書き、ホストする人々に多大な柔軟性をもたらします。Webサービスがより一般的に可用になってい くのと同時に、その複雑性が増しより多くのアプリケーションがそれらのWebサービスをアプリケーションに統合するのが可能になります。なぜならほとんどのファイナルアプリケーションは最終的なところユーザと相互作用し、その挑戦はユーザにより良いエクスペエンスを提供することだからです。非同期のWebサービス呼び出しはクライアント、サーバサイド両方において異なるレベルで提供され、またこれらの現代の挑戦を実現するのを助けます。
原文はこちらです:http://www.infoq.com/news/2007/12/axis2-async

この記事に星をつける

おすすめ度
スタイル

BT