2009年11月19日木曜日

Rampart 1.4/quickstart

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 件のコメント:

コメントを投稿