今更ながら Axis を使ってみた その2 アプリケーションの公開
前回は前準備について投稿いたしました。それでは今回いよいよオリジナルのアプリケーションを作成して、 Web サービスとして公開する手順について執筆して行きたいと思います。
前回 NetBeans 上に作成した Web アプリケーションプロジェクトを使って Web サービスアプリケーションの作成を進めて行きます。今回作成するアプリケーションは、 SparrowsCafe と言うコーヒー屋さんに、商品名と数量を記載した注文書を送信して、注文合計金額が記載されたメッセージを受け取ると言う簡単なアプリケーションを作成します。
まずは手順1から・・・
手順1: Web サービスインターフェースの作成
と言っても、普段ランタイムで実行できる Java クラスファイルとなんら変わりのないクラスを作成します。コードは以下のとおり・・・
public interface SparrowsCafe extends java.rmi.Remote {手順2: WSDL ファイルの生成
public java.lang.String purchase(java.lang.String nameOfCoffee, int quantum) throws java.rmi.RemoteException;
}
次に、作成したインターフェースをコンパイルし、そのクラスファイルから axis から提供されている Java2WSDL を利用して WSDL ファイルを生成します。
生成場所は任意なので、さしあたってはユーザーのホームポジション上で作業できるように、 wsdlwork と言うディレクトリを作成し、その配下に lib と言うディレクトリを作成して、 Java2WSDL を実行する為に必要な jar ファイル群を配置します。配置した jar ファイルは以下のとおり・・・
今度はターミナルの画面にて、 wsdlwork に移動し、そのカレントにて実行時に必要なクラスパスを設定します。
$ export CLASSPATH=./lib/activation.jar:./lib/axis.jar:./lib/commons-discovery-0.2.jar:./lib/commons-logging-1.0.4.jar:./lib/jaxrpc.jar:./lib/log4j-1.2.8.jar:./lib/mail.jar:./lib/wsdl4j-1.5.1.jar:./lib:$PROJECT_HOME/build/web/WEB-INF/classesこれでコマンドの実行準備は完了しました。早速以下のコマンドを実行して WSDL を自動生成します。
$ java org.apache.axis.wsdl.Java2WSDL -o ./SparrowsCafe.wsdl -l"http://localhost:8081/ContextName/services/SparrowsCafe" jp.glassfish.sparrow.endpoint.SparrowsCafeコマンド実行後、カレントに -o で指定したファイル名で、 WSDL ファイルが出現します。これで WSDL ファイルの生成は完了です。
※注)実行環境によっては WSDL ファイルのパラメータ要素の定義にて、パラメータ名が "in0","in1" に変わってしまっている時があります。このままでも特に問題はないですが、自分が定義したパラメータ名でその後の作業を続けたい場合は名称を全て修正する必要があります。
手順3: WSDL2Java の実行
Web サービスアプリケーションを作成する時に、避けては通れないのがこの手順、自分でデプロイメント記述子ファイルを記述したり、 Web サービスクライアントを作成することができる人は、この手順を省略しても良いですが、できることなら提供されたアーキテクトに準拠した形で作業は進めたいことと思います。上記手順2で生成された WSDL ファイルを利用して、以下のコマンドを実行します。
$ java org.apache.axis.wsdl.WSDL2Java -o ./src/java -d Session -s -S true ./SparrowsCafe.wsdlコマンド実行後、カレント配下に -o で指定したディレクトリが出現し、その配下に各リソースが生成されます。
生成された各リソースの内容と配備先は以下の通りです。
ファイル名 内 容 配備先
SparrowsCafe.java 公開するサービスのインターフェース、 java.rmi.Remote を継承している以外は作成時のインターフェースと全く同じです。 サーバー/クライアント
SparrowsCafeService.java クライアント用のサービスインターフェース クライアント
SparrowsCafeServiceLocator.java サービスインターフェースのインスタンス生成用のクラス クライアント
SparrowsCafeSoapBindingImpl.java サービスインターフェースの実装クラス、サービスのビジネスロジックは、ここに実装します。 サーバー
SparrowsCafeSoapBindingSkeleton.java 先ほどのサービスインタフェース実装クラスのスケルトンです。 サーバー
SparrowsCafeSoapBindingStub.java Web サービスへアクセスするためのスタブクラスです。 クライアント
deploy.wsdd 配備記述子ファイル Axis が提供している AdminClient を実行するカレントに配置します。
undeploy.wsdd 配備取り消し記述子ファイル 同上
手順4: サービスの実装クラスにビジネスロジックを実装し、 Tomcat5 へ配備する。
今回は、pricelist と言うプロパティファイルに単価情報を登録しておき、クライアントから受信した商品名をキーに、単価をひき、クライアントから受信した注文数量と単価で注文金額を算出してメッセージを返すと言う簡単なアプリケーションを、 NetBeans 上で作成します。 pricelist.properties は、サービスインターフェースと同一パッケージ上に作成します。 pricelist.propeties の内容は以下のとおり・・・
kilimanjaro=450次に、手順3にて生成した SparrowsCafeService.java , SparrowsCafeSoapBindingImpl.java , SparrowsCafeSoapBindingSkeleton.java を、同一パッケージ上に再配置します。
mocha=430
blue.mountain=380
blend=400
そして SparrowsCafeSoapBindingImpl.java を開き、当アプリケーションの要件どおりにコードを実装します。実装したコードは以下のとおり・・・
package jp.glassfish.sparrow.endpoint;ここまで出来たらプロジェクトを右クリックして"配備"をクリックし、 Tomcat5 へ配備します。
import java.io.Serializable;
import java.util.ResourceBundle;
public class SparrowsCafeSoapBindingImpl implements SparrowsCafe, Serializable {
private static final long serialVersionUID = 6681209400119790522L;
private static final ResourceBundle priceList = ResourceBundle.getBundle("jp.glassfish.sparrow.endpoint.pricelist");
public java.lang.String purchase(java.lang.String nameOfCoffee, int quantum) throws java.rmi.RemoteException {
final String priceString = priceList.getString(nameOfCoffee);
if(priceString == null || priceString.length() == 0) {
return "まことに申し訳ありませんが、ご注文頂いた商品は、当店では扱っておりません。";
}
int sum = Integer.parseInt(priceString) * quantum;
return "ご注文頂きました " + nameOfCoffee + " 数量 " + quantum + "承りました。ご注文合計金額は ¥" + sum + "に成ります。 ご利用ありがとうございました。";
}
}
手順5: Web サービスを公開する。
再びターミナルへ戻り、いよいよ axis から提供された AdminClient を使ってサービスを公開します。ターミナルより、以下のコマンドを実行します。
java org.apache.axis.client.AdminClient -lhttp://localhost:8081/SparrowsWS/services/AdminService ./src/java/jp/glassfish/sparrow/endpoint/deploy.wsdd上記コマンドにて、最後の行に (Done processing) と表示されれば、サービスの作成から公開までの全ての手順は完了です。
手順6: Web サービスへアクセスするクライアントアプリケーションを作成する。
それでは早速アクセスする為のクライアント側アプリケーションの作成に取りかかります。まずは Java ランタイムで実行できるプロジェクトを1つつくり、ライブラリに axis.jar , jaxrpc.jar , commons-logging-1.0.4.jar , log4j-1.2.8.jar , commons-discovery-0.2.jar , saaj.jar , wsdl4j-1.5.1.jar , activation.jar , mail.jar を追加します。
それからソースパッケージに、手順3にて生成した SparrowsCafeService.java , SparrowsCafeService.java , SparrowsCafeServiceLocator.java , SparrowsCafeSoapBindingStub.java を再配置します。
次に、プロジェクトの主クラスに、 Web サービスへアクセスする為のコードを実装します。実装したコードについては以下のとおり・・・
package jp.glassfish.sparrow.client;
import jp.glassfish.sparrow.endpoint.SparrowsCafeServiceLocator;
import jp.glassfish.sparrow.endpoint.SparrowsCafe;
public class Main {
public static void main(String[] args) {
try {
//WSDL から生成されたコードを利用する。
final SparrowsCafe sparrowsCafe = new SparrowsCafeServiceLocator().getSparrowsCafe();
System.out.println(sparrowsCafe.purchase("kilimanjaro", 2));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
これでアプリケーションの作成手順は全て完了です。それでは早速、最後の手順にて作成したクライアントアプリケーションを実行してみます。実行結果は以下のとおりです。
如何でしたでしょうか? 今回は axis-ant を利用しないで手作業による手順を詳述させていただきましたが、達人になれば、これらプロセスを build.xml にしたためてさくさくと作業を進めて行くでしょう。但し、そうなるためには、今の手順をまずは手作業で実行して理解しておく必要性を感じますね。
それにしても JAX-RPC 1.x までの開発プロセスは、本当に複雑きわまりないと言う所感を受けます。 JAX-WS になってからは、これらの手順が簡素化されているので、 EAI サーバープロダクト等に頼らない Web サービスアプリケーションの導入実績も、徐々に増えてくるのではないかと考えています。
それにしても、この手順を見る限りでは、「 SOAP なんて、悪い冗談はよしてくれ」、なんて言う意見も、理解できなくもないですね・・・
(○。◎ピューーー<<<<<<<
| サン・マイクロシステムズ イベント情報 | サン・マイクロシステムズ キャンペーン情報 |
Comments
Pingback from jacksparrow » NetBeans 6.5 で楽々 JAX-RPC クライアントアプリケーションの作成
Date: 2009 年 5 月 10 日, 11:28 PM
[...] 前回 Axis を利用した Web サービスアプリケーションの作成について、 Web サービスの公開から、 Web サービスクライアントアプリケーションの作成までを、手作業で行うトピックについて [...]



Write a comment