about Axis

ここでは,Axisという,記録DBや映像DBで利用するSOAPによるWebサービスを受け持つtomcatの1つのアプリケーションについての利用法をまとめておく.

PHPによるWebServices

webMathematica版のWebServicesが不調なのと,どうせ映像DBではPHPで利用するからということで,PHP版のSOAP/Web Servicesを試そうとした.ところがSOAPはPHP5で大幅に強化されたとのこと.PHP5にしなければいけないか...
そうすると,MySQLとapacheのversionの整合もすこし心配である.が,今後PHP5がメジャーになると考えれば,移行も必要かもしれない.(2004-08-09)

しかし,pukiWikiなどは,まだPHP4で行きそうだし,いっきに変換が出来るだろうか...

PHP5に移行した.これで,SOAPをためしてみよう.(2004-08-21)

php/testsoap.phpのページを開くと,5が表示される.これは,以下のPHPのソースで,Calc.jwsを実行した結果を表示している.

<?php
 $client = new SoapClient("http://localhost/axis/Calc.jws?wsdl");
 echo $client->__call("add", array(2, 3));
?>

webMathematicaとWebServicesの問題

webMathから,WebServicesを呼ぶと,一回目は動くが,2度目から$Failedになってしまうというバグに見舞われた.これは,どんなWebServicesでも起きることなので,BUGと思う.Wolframには連絡をしておいた.早急に修正して欲しいものだ.

Wolframから返事が来て,バグDBに登録されてとのこと.そこにWebServicesのb4があったので,落としてきて利用してみたが,結果は同じであった.(2004-08-10)

WebServicesの新しいパッケージを使うことができて,ようやく,webMath+WebServicesが動き出した.(2004-10-26)

日本語処理について

MySQLは,日本語文字コードとして,Shift-JISとEUCの設定ができる.現在は,EUCになっているようだ. そこで,MySQLとJDBCを経由してのやりとりで,MySQLのEUCの文字列を,JavaのUnicodeにしておかないといけない.
これについては,適当な関数があるので,それを利用して,EUCをUnicodeにしてJavaに保存できるようにした.
MySQLのJDBCのconnectionには,?useUnicode=true&encoding=EUC_JPなどの設定ができるようであるが,それを試しても実際にやりとりされる文字コードは,EUCのままであるようであった.そこで,プログラム中にEUC->Unicodeをいれている.これは,DBから,getStringで持ってくるとこにでてくる.

あと,JavaとMathematicaでは,お互いにUnicodeベースなので,変換については,気にしなくても良い. searchの引数に,encodingの指定が出来るようにしても良いかも.

エラー処理等

Exceptionの処理の方法を本からやってみて,うまく動いた.こんなエラーがでる.

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <soapenv:Fault>
   <faultcode>soapenv:Server.generalException</faultcode>
   <faultstring>Syntax error or access violation,  message from server: &quot;
   You have an error in your SQL syntax.  Check the manual that corresponds 
  to your MySQL server version for the right syntax to use near &apos;MIYAJI&apos;
  %&apos;&apos; at line 1&quot;
</faultstring>
   <detail>
    <ns1:exceptionName xmlns:ns1="http://xml.apache.org/axis/">BookSearchException
  </ns1:exceptionName>
   </detail>
  </soapenv:Fault>
 </soapenv:Body>
</soapenv:Envelope>

Mathematicaでもちゃんとキャッチできるようである.

複雑な値を返すためのBeansの利用

JavaBeansを利用して,複雑な値を返す方法ができた.あとは,ダイレクトにXMLを返したりする方法.これは,かなりコードが面倒になりそう.JavaBeansのままでも良いか...

疑問点

いくつかのSOAPサーバーに対して,おなじメソッド名で,アクセスしたい時に,MathematicaのWebServicesを利用する時には,どうやって区別するのか? MathLinkの場合なら,add[linkname, 1, 2]というように,リンク名を引数にいれてcallしていた.似たような状況だが,どうするのだろうか.

どうも,コンテクストを変えて設定をしているようだ.納得.

インストール

いくつかのjarファイルを用意しておかなければいけない.インストールがうまくいっているかは,http://localhost:8080/axis/happyaxis.jspを実行することでわかる.

tomcatを5に変更した時に,axisのインストールをやりなおさなければいけなかった.これは,tomcat 4の時に,置いたいくつかのjarファイルがみつからなくなったためであった.結局,以下のjarファイルを置くことで,無事動くようになった.

  • webappsにaxisのdirをコピー
  • saaj.jarとjaxrpc.jarを/usr/local/tomcat/common/lib/にコピー
  • mail.jarを/usr/local/tomcat/common/libにコピー

WebServiceの配置(deploy)

最も簡便な方法として,Java Web Service(jws)を利用する方法がある. Calc.javaというファイルがある.

public class Calc {
  public int add(int i1, int i2)
  {
    return i1 + i2; 
  }
 public int subtract(int i1, int i2)
  {
    return i1 - i2;
  }
}

このClculatorクラスをWebServiceとして公開するには,このファイルをCalc.jwsとjwsの拡張子をつけて,ファイルを,/usr/local/tomcat/webapps/axis/のフォルダー[SOAPサービスをするaxisのフォルダー]に置く.

サービスの利用

方法1.webブラウザを利用する

web browserから,http://127.0.0.1/axis/Calc.jws?method=add&a=1&b=2を実行する.
以下のXMLが返ってくる.ただし,browserでは,XMLの式は現れず,3という数字だけがでてくる.以下のXMLは,browserで「ソースをみる」を選ぶと表示される.

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <addResponse soapenv:encodingStyle=
    "http://schemas.xmlsoap.org/soap/encoding/">
   <addReturn xsi:type="xsd:int">3</addReturn>
  </addResponse>
 </soapenv:Body>
</soapenv:Envelope>

このなかの <addReturn xsi:type="xsd:int">3</addReturn>が返された答えである.

方法2.MathematicaのWebServiceパッケージを利用する

  1. webServiceパッケージの読み込み
    Needs["WebServices`"]
  2. Calc.wsdlの読み込み
    InstallService["http://127.0.0.1/axis/Calc.jws?wsdl"]
    により,{add, subtract}が返ってくる.この2つのサービスが利用できる.Calculatorのwsdl定義は,*.jwsであれば自動的に出来上がっている.
    その内容は,http://127.0.0.1/axis/Calc.jws?wsdl とweb browserでアクセスして,「ソースをみる」を選ぶと,WebServicesの公開する関数のインターフェイスを定義するXMLが読める.
  3. 実行
    In[1] := add[1,2]
    Out[1] = 3
    In[2] := subtract[4, 3]
    Out[2] = 1

WebServiceは,WSDLファイルからMathematicaの関数にバインドされるので,あたかもMathematicaの関数のように実行が出来る.

方法3.Javaクライアントプログラムからの実行

public class CalcClient
{
   public static void main(String [] args) throws Exception {
       String endpoint = "http://localhost:" + options.getPort() +
        "/axis/Calculator.jws";
       Integer i1 = new Integer(args[1]);
       Integer i2 = new Integer(args[2]);

       Service  service = new Service();
       Call     call    = (Call) service.createCall();

       call.setTargetEndpointAddress( new java.net.URL(endpoint) );
       call.setOperationName( method );
       call.addParameter( "op1", XMLType.XSD_INT, ParameterMode.IN );
       call.addParameter( "op2", XMLType.XSD_INT, ParameterMode.IN );
       call.setReturnType( XMLType.XSD_INT );

       Integer ret = (Integer) call.invoke( new Object [] { i1, i2 });
       System.out.println("Got result : " + ret);
   }
}

JWSを使わずに,WSDDを利用する方法

Caluclator.javaをコンパイルして,Caluclator.classをWEB-INF/classesにおく.

deploy.wsddをつくる.

<deployment
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  <service name="Calculator" provider="java:RPC" style="rpc" use="encoded">
      <parameter name="className" value="Calculator"/>
      <parameter name="allowedMethods" value="*"/>
      <parameter name="scope" value="Request"/>
  </service>
</deployment>

これを,以下のコマンドで登録する.

%java -cp $AXISCLASSPATH org.apache.axis.client.AdminClient deploy.wsdd

これで,新しいCaluclatorが登録される.確認するには,

%java -cp $AXISCLASSPATH org.apache.axis.client.AdminClient list 

とする.そうすると,deploy.wsddと同じ設定がはいっている.

 <service name="Calculator" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
  <parameter name="scope" value="Request"/>
  <parameter name="className" value="Calculator"/>
 </service>

これを,Mathematicaで実行するには,

 InstallService["http://127.0.0.1:8080/axis/Calculator?wsdl"]

とすると,{add, add, subtract}が返ってきて,それ以後,add, subtractが利用できる.


このページの著作権は,すべて宮地 力に所属します.
もし,内容を利用される場合は,宮地までメールにて,ご連絡ください.
また,このページへのリンクは,フリーです.