Axis1とAxis2の相互接続
Webサービスといえば巷はRESTで盛り上がっていますが、企業内システムではSOAPも多く使われています。SOAPの代表的な実装としてApache Axisがあります。2005年ぐらいにAxis1が爆発的に使われ始めた記憶がありますが、パフォーマンスが悪いとかWSDL 2.0に準拠していないといった問題があり、その後はAxis2が使われるようになっています。Axis1とAxis2のクライアントは大きく仕様が変わっています。サーバ側はデプロイし直すだけでよいですが、クライアント側はライブラリの差し替えだけでは対応できません。
Axis2への移行を考えているプロジェクトもあると思いますが、そこで問題になるのがシステム間インタフェースの変更です。Axis2への移行は何から始めればスムーズにできるのか?
仮説を立てます。
- Axis1サーバ(S)にAxis1クライアント(C)が問い合わせている。
- (S)をAxis2に置き換える。Axisから呼び出されるコードは同一のままである。
- (C)はAxis1のまま、エンドポイントのみ変更する。
- (C)をAxis2に置き換える。
仮説が正しいかはこれから調べていきます。
Axis1クライアントからAxis2サーバへの接続
今回はAxis1クライアントからAxis2サーバに接続できるか検証します。サービスはApache Axisに標準で入っているVersionを使用します。
(S1) | Axis1サーバのサービス Version#getVersion() (RPC/Encoded) (エンドポイント: http://localhost:8080/axis1-server/services/Version) |
---|---|
(S2) | Axis2サーバのサービス Version#getVersion() (Document/Literal) (エンドポイント: http://localhost:8080/axis2-server/services/Version.VersionHttpSoap12Endpoint/) |
(C) | Axis1クライアント |
具体的には、(C)→(S1)と(C)→(S2)が同じコードで実現できるか確認します。(C)のコードを下記に示します。
public String queryVersion(String endpoint) throws ServiceException, MalformedURLException, RemoteException { Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new URL(endpoint)); call.setOperationName(new QName(null, "getVersion")); String ret = (String) call.invoke(new Object[] {}); return ret; }
実行結果を下記に示します。(S1)(S2)ともに正しく呼び出せていることが分かります。
--endpoint: http://localhost:8080/axis1-server/services/Version Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT) --end --endpoint: http://localhost:8080/axis2-server/services/Version.VersionHttpEndpoint/ Hello I am Axis2 version service , My version is 1.4.1 --end
Versionのような簡単なサービスでは、Axis2のサービスも問題なく呼び出せました。複雑な引数を持つサービスでも同様か今後確認していきます。