Webサービスの動作を決めるスコープの謎パソコンで試してわかるWebサービス(4)(3/4 ページ)

» 2002年11月08日 00時00分 公開
[イチロー樋口研究室監修]

JavaアプリケーションとWebサービスの違い

 第3回では、Webサービスは次の図のように実行されるはずでした。しかし実行結果が想定していた結果にならなかったことから正しくないことは分かっていました。

図2 Webサービスでの実行(正しい絵ではない!) 図2 Webサービスでの実行(正しい絵ではない!)

 今回の2つの解析テストで次のようなことが分かりました。

 

(1)宿題プログラム1回の実行でSOAPが6回やりとりされている

(2)宿題プログラム1回の実行でJavaBeansが6回インスタンス化されている

 


 すなわち、SOAPの呼び出しごとにJavaBeansがインスタンス化されていることが分かります。これは、SOAPの処理が別々のインスタンスに対して、「setInputValue」「add」「getResultValue」というメソッドを実行していることになり、想定していた結果にならないのは明らかです。Beanに加算する値を「setInputValue」で設定したにもかかわらず、別のBeanで「add」を実行し、さらに別のBeanで「getResultValue」にて値を取得しています。これでは、いつまでたっても初期化している「0」が返ってくるのもしかたありません。

図3 Webサービスでの実行(実際の動き) 図3 Webサービスでの実行(実際の動き)

 第3回ではJavaアプリケーションで実行しました。このSimpleAddTestプログラムをもう一度確認してみましょう。このプログラムではインスタンス化(new)が1回しか実行されていません。すなわち、1つのインスタンスに対する操作だったために想定していた結果を得ることができるのです。

図4 Javaアプリケーションでの実行 図4 Javaアプリケーションでの実行

 とするならば、WebサービスにおいてもJavaアプリケーションと同様に「複数回の操作を同一のJavaBeansインスタンスに対して実行すればよい」はずです。Axisにおいてもこれを実装する方法があります。それが「スコープ」です。

Webサービスの動作を決めるスコープ

 Webサービス化しても、JavaBeansに対してJavaアプリケーションと同様な動作を行わせることが可能です。この設定がスコープです。

 スコープは配置記述子ファイル(Deployment Descriptor)に設定します。第3回の配置記述子ファイルを次のように変更します。

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  <service name="SimpleAddService" provider="java:RPC">
    <parameter name="className" value="atmarkit.SimpleAddBean"/>
    <parameter name="allowedMethods" value="*"/>
    <parameter name="scope" value="application"/>
  </service>
</deployment>

 この配置記述子を「SimpleAddService_application.wsdd」というファイル名で<@WORK>ディレクトリに保存します。

 また、いま設定しているWebサービスを設定解除(Undeploy)するために次のファイルも用意します(ファイル名undeploy.wsdd)。

<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
  <service name="SimpleAddService"/>
</undeployment>

  2つのファイルが用意できたら、次の2つのコマンドを実行します。

> java org.apache.axis.client.AdminClient undeploy.wsdd
- Processing file undeploy.wsdd
<Admin>Done processing</Admin>

> java org.apache.axis.client.AdminClient SimpleAddService_application.wsdd
- Processing file SimpleAddService_application.wsdd
<Admin>Done processing</Admin>


 これで、スコープの変更が完了しました。早速Webサービスを実行してみましょう。

D:\@work> java atmarkit.SimpleAddClient 1 5 http://localhost:8081/axis/servlet/AxisServlet
1
6


 想定していた結果を得ることができました。そして、今回試した2つの解析も確認してみましょう。

 

(1)SOAPは6回実行されていますか?(TCPモニタで確認)

(2)JavaBeansは1回だけインスタンス化されていますか?(Tomcatで確認)

 


 これで、次の図のように実行されていることが分かるはずです。

図5 Webサービスでの実行(スコープ:アプリケーション) 図5 Webサービスでの実行(スコープ:アプリケーション)

 さて、すべてが解決したのでしょうか? 何回かWebサービスを実行してみてください。

> java atmarkit.SimpleAddClient 1 5 http://localhost:8081/axis/servlet/AxisServlet
1
6
> java atmarkit.SimpleAddClient 1 5 http://localhost:8081/axis/servlet/AxisServlet
7
12


 今度は逆に前回の結果が引き継がれていることが分かります。Tomcatの画面も確認してみてください。「インスタンス化されました!」は1つしか出ていないということが分かります。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。