GeekFactory

int128.hatenablog.com

Axis1とAxis2の相互接続

Webサービスといえば巷はRESTで盛り上がっていますが、企業内システムではSOAPも多く使われています。SOAPの代表的な実装としてApache Axisがあります。2005年ぐらいにAxis1が爆発的に使われ始めた記憶がありますが、パフォーマンスが悪いとかWSDL 2.0に準拠していないといった問題があり、その後はAxis2が使われるようになっています。Axis1とAxis2のクライアントは大きく仕様が変わっています。サーバ側はデプロイし直すだけでよいですが、クライアント側はライブラリの差し替えだけでは対応できません。

Axis2への移行を考えているプロジェクトもあると思いますが、そこで問題になるのがシステム間インタフェースの変更です。Axis2への移行は何から始めればスムーズにできるのか?

仮説を立てます。

  1. Axis1サーバ(S)にAxis1クライアント(C)が問い合わせている。
  2. (S)をAxis2に置き換える。Axisから呼び出されるコードは同一のままである。
  3. (C)はAxis1のまま、エンドポイントのみ変更する。
  4. (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のサービスも問題なく呼び出せました。複雑な引数を持つサービスでも同様か今後確認していきます。