第3回では、Webサービスは次の図のように実行されるはずでした。しかし実行結果が想定していた結果にならなかったことから正しくないことは分かっていました。
今回の2つの解析テストで次のようなことが分かりました。
(1)宿題プログラム1回の実行でSOAPが6回やりとりされている
(2)宿題プログラム1回の実行でJavaBeansが6回インスタンス化されている
すなわち、SOAPの呼び出しごとにJavaBeansがインスタンス化されていることが分かります。これは、SOAPの処理が別々のインスタンスに対して、「setInputValue」「add」「getResultValue」というメソッドを実行していることになり、想定していた結果にならないのは明らかです。Beanに加算する値を「setInputValue」で設定したにもかかわらず、別のBeanで「add」を実行し、さらに別のBeanで「getResultValue」にて値を取得しています。これでは、いつまでたっても初期化している「0」が返ってくるのもしかたありません。
第3回ではJavaアプリケーションで実行しました。このSimpleAddTestプログラムをもう一度確認してみましょう。このプログラムではインスタンス化(new)が1回しか実行されていません。すなわち、1つのインスタンスに対する操作だったために想定していた結果を得ることができるのです。
とするならば、WebサービスにおいてもJavaアプリケーションと同様に「複数回の操作を同一のJavaBeansインスタンスに対して実行すればよい」はずです。Axisにおいてもこれを実装する方法があります。それが「スコープ」です。
Webサービス化しても、JavaBeansに対してJavaアプリケーションと同様な動作を行わせることが可能です。この設定がスコープです。
スコープは配置記述子ファイル(Deployment Descriptor)に設定します。第3回の配置記述子ファイルを次のように変更します。
<deployment xmlns="http://xml.apache.org/axis/wsdd/"
|
この配置記述子を「SimpleAddService_application.wsdd」というファイル名で<@WORK>ディレクトリに保存します。
また、いま設定しているWebサービスを設定解除(Undeploy)するために次のファイルも用意します(ファイル名undeploy.wsdd)。
<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
|
2つのファイルが用意できたら、次の2つのコマンドを実行します。
> java org.apache.axis.client.AdminClient
undeploy.wsdd
|
これで、スコープの変更が完了しました。早速Webサービスを実行してみましょう。
|
想定していた結果を得ることができました。そして、今回試した2つの解析も確認してみましょう。
(1)SOAPは6回実行されていますか?(TCPモニタで確認)
(2)JavaBeansは1回だけインスタンス化されていますか?(Tomcatで確認)
これで、次の図のように実行されていることが分かるはずです。
さて、すべてが解決したのでしょうか? 何回かWebサービスを実行してみてください。
|
今度は逆に前回の結果が引き継がれていることが分かります。Tomcatの画面も確認してみてください。「インスタンス化されました!」は1つしか出ていないということが分かります。
Copyright © ITmedia, Inc. All Rights Reserved.