Axis のサンプルを独立にビルド・デプロイして、独立のクライアントから呼ぶ方法。
こういうシンプルなサービスとクライアントのペアを作れるようにしておくと、例えば、これに対して暗号化を追加してみるとか、いろんな実験の叩き台として便利。
以下、前提- Tomcat v6.0 が{tomcat-home} にインストールされている
- Axis2 1.5 が{axis2_home} にインストールされている
■ quickstart のビルド- 適当な所に{axis2_home}/samples/quickstart をコピーする。
- build.xml の AXIS2_HOME が相対パスで指定されているので、絶対パス(もしくは環境変数)に書き換える。
- ant を叩いてビルド。generics 関連の警告が出るので嫌だったら直す。
- 出来上がったStockQuoteService.aarを{tomcat-home}/webapps/axis2/WEB-INF/services下に置く。面倒なので build.xml に deploy.service 的な ターゲットを書いておくと楽。
- axis2 の管理コンソール を開いてWSDLのURLを得る
- その WSDL を利用して、soapUI とかからメッセージを投げて動きを確かめる。 update{symbol="hundred", price=100}のような適当なメッセージを送って、getPrice{symbol="hundred"}で return=100 なら成功
■ クライアントコードを書く。- WSDL を作成する。ant generate.wsdl
- WSDL からクライアントスタブを作成する。
<target name="generate.stub">
<taskdef name="axis2-wsdl2java"
classname="org.apache.axis2.tool.ant.AntCodegenTask"
classpathref="axis2.classpath"/>
<mkdir dir="generated"/>
<axis2-wsdl2java
wsdlfilename="${build.dir}/StockQuoteService.wsdl" output="generated/" />
</target>
- クライアントのエントリポイントを書く
package samples.quickstart;
import samples.quickstart.StockQuoteServiceStub.*;
public class Client {
public static void main(String[] args) throws Exception {
StockQuoteServiceStub service = new StockQuoteServiceStub();
GetPrice arg0 = new GetPrice();
arg0.setSymbol("hundred");
GetPriceResponse response = service.getPrice(arg0);
System.out.println("price=" + response.get_return());
}
}
- price=100 がコンソール出力されたら成功
■ 自動生成クライアントスタブを使わない場合- こんな感じのコードでも可
public class Client {
private static final String URL
= "http://localhost:8888/axis2/services/StockQuoteService.StockQuoteServiceHttpSoap12Endpoint";
private static final String AXIS2_REPO = "axis-repo";
public static void main(String[] args) throws Exception {
ConfigurationContext ctx =
ConfigurationContextFactory.createConfigurationContextFromFileSystem(
AXIS2_REPO, AXIS2_REPO + "/conf/axis2.xml");
ServiceClient client = new ServiceClient(ctx, null);
Options options = new Options();
options.setAction("urn:getPrice");
options.setTo(new EndpointReference(URL));
client.setOptions(options);
OMElement response = client.sendReceive(getPayload("hundred"));
System.out.println(response);
}
private static OMElement getPayload(String value) {
OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace ns = factory.createOMNamespace(
"http://quickstart.samples/xsd","ns1");
OMElement elem = factory.createOMElement("getPrice", ns);
OMElement childElem = factory.createOMElement("symbol", null);
childElem.setText(value);
elem.addChild(childElem);
return elem;
}
}
- ちょっと何かを試してみる程度なら、スタブ版よりこっちの方が見通しが良くて楽かもしれない。
0 件のコメント:
コメントを投稿