本ドキュメントはS2Axis2の基本的な使い方 について記述しています。
S2Axis2を使用するには、Axis2およびS2をweb.xml に設定する必要があります。Axis2およびS2の設定の詳細はそれぞれのドキュメントを参照してください。
S2Axis2はS2コンテナの初期化時にコンポーネントをAxisに登録します。このため、S2よりも先にAxis2が初期化されている必要があります。そのためには、Axis2が提供するサーブレットのload-on-startup をS2よりも小さくします。
以下はS2Axis2Examplesに含まれているweb.xml です。このサンプルでは、Axis2のload-on-startup を10、S2のload-on-startup を20に設定しています。ただし、S2Axisの場合と、Axis2のサーブレット部分の設定内容が異なっている点に注意してください。
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>s2axis2-examples</display-name>
<filter>
<filter-name>s2filter</filter-name>
<filter-class>
org.seasar.framework.container.filter.S2ContainerFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>s2filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
<!--<init-param>-->
<!--<param-name>axis2.xml.path</param-name>-->
<!--<param-value>/WEB-INF/conf/axis2.xml</param-value>-->
<!--<param-name>axis2.repository.path</param-name>-->
<!--<param-value>/WEB-INF</param-value>-->
<!--</init-param>-->
<load-on-startup>10</load-on-startup>
</servlet>
<servlet>
<servlet-name>s2servlet</servlet-name>
<servlet-class>
org.seasar.framework.container.servlet.S2ContainerServlet
</servlet-class>
<init-param>
<param-name>configPath</param-name>
<param-value>app.dicon</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>20</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>s2servlet</servlet-name>
<url-pattern>/s2servlet</url-pattern>
</servlet-mapping>
<session-config>
<!-- Default to 5 minute session timeouts -->
<session-timeout>5</session-timeout>
</session-config>
<!-- currently the W3C havent settled on a media type for WSDL;
http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
for now we go with the basic 'it's XML' response -->
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
公開するサービスクラス
POJOのクラスを、Webサービスとして公開することが可能です。サービスは、公開するインタフェースと、その実装クラスに分けて作成します。
public interface Echo {
String echo(int id, String message);
}
public class EchoImpl implements Echo {
public String echo(int id, String message) {
return "[id = " + id + "] " + message;
}
}
dicon定義
S2Axis2を使用するサーバ側では、app.dicon ファイルの中でs2axis2.dicon ファイルをインクルードします。
<components>
<include path="s2axis2.dicon"/>
・・・
</components>
s2axis2.dicon はs2axis2-x.x.x.jar の中に含まれているため、ロケーションを気にする必要はありません。
サービスのデプロイ(コンポーネント定義)
S2コンテナで管理しているコンポーネントをWebサービスとしてAxis2にデプロイするには、そのコンポーネントの<component> 要素の子として<meta> 要素を指定します。
公開するサービスのコンポーネント定義には、実装クラスを指定します。
<component name="Echo" class="org.seasar.remoting.axis2.examples.ex01.EchoImpl">
<meta name="axis-service"/>
</component>
<component> 要素のname 属性は必須です。公開されるサービスのURLは次のようになります。
- diconファイルに名前空間が指定されていない場合
context-path/services/name
- diconファイルに名前空間が指定されている場合
context-path/services/namespace/name
サービスのデプロイ(service.xmlでの定義)
Axis2では、service.xmlファイルを使用してサービスをデプロイしますが、S2Axis2でも、そのファイルを指定してサービスをデプロイすることができます。
この場合、<component> 要素ではなく、<meta> 要素を指定します。
<meta name="axis-deploy">"org/seasar/remoting/axis2/examples/ex05/service.xml"</meta>
service.xmlの記述の仕方は、Axis2で利用するものと変わりません。
サービスの呼び出し
POJOのクラスをサービスとして公開しているため、クライアント側でも、通常のクラスを呼び出すのと同様の処理で、サービスを呼び出すことが可能です。
public class EchoClient {
private Echo service;
public void execute() {
int id = 1;
String msg = "echo message";
String result = service.echo(id, msg);
System.out.println(result);
}
public void setEcho(Echo echo) {
this.service = echo;
}
public static void main(String[] args) {
SingletonS2ContainerFactory.setConfigPath("client.dicon");
SingletonS2ContainerFactory.init();
S2Container container = SingletonS2ContainerFactory.getContainer();
Echo echo = (Echo)container.getComponent(Echo.class);
EchoClient client = new EchoClient();
client.setEcho(echo);
client.execute();
}
}
dicon定義
S2Axis2を使うことで、Webサービスをコンポーネントとして使用することが出来ます。
Javaインタフェースを使用してサービスを呼び出すには、diconファイルを次のように記述します。
<!-- リモート呼び出しのインターセプタ -->
<component name="remoting"
class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>
<!-- Axisサービス -->
<component class="org.apache.axis2.description.AxisService" autoBinding="none"/>
<!-- Axisコネクタ -->
<component name="connector"
class="org.seasar.remoting.axis2.connector.AxisInOutConnector">
<property name="baseURL">
new java.net.URL("http://localhost:8080/s2axis2-examples/services/")
</property>
</component>
<!-- Webサービスのプロキシ -->
<component name="Echo" class="org.seasar.remoting.axis2.examples.ex01.Echo">
<aspect>remoting</aspect>
</component>
呼び出すWebサービスごとにプロキシが必要です。プロキシの<component> 要素のclass 属性にはWebサービスのJavaインタフェースを指定します。このコンポーネントにはRemotingInterceptor をアスペクトとして指定します。プロキシはWebサービスのインタフェースごとに一つの<component> 定義が必要です。
RemotingInterceptor はプロキシのメソッド呼び出しを横取りし、Axisコネクタを呼び出します。上の例では、S2の自動バインディングによりRemotingInterceptorのプロパティにAxisコネクタが設定されています。RemotingInterceptorは、Axisコネクタごとに一つの<component> 定義が必要です。
AxisコネクタはAxisサービスを通じてWebサービスを呼び出します。上の例では、S2の自動バインディングによりAxisコネクタのプロパティにAxisサービスが設定されています。baseURLプロパティには、WebサービスのエンドポイントのベースURLを指定します。このベースURLにプロキシの<component>要素のname属性で指定された名前を付加したURLが実際の通信で使用されます。AxisコネクタはWebサービスのエンドポイントごとに一つの<component> 定義が必要です。
メッセージ形式に合わせたAxisコネクタ
Axis2では、同期型だけでなく非同期型のメッセージ形式もサポートしています。S2Axis2では、メッセージ形式に合わせてAxisコネクタを変更します。
各メッセージ形式と、Axisコネクタの対応は以下のようになっています。システムに合わせて、diconファイルで指定するAxisコネクタを適宜変更してください。
メッセージ形式 |
説明 |
Axisコネクタ |
同期型要求応答形式
(Request/Response) |
クライアントから要求を送信した後、サービスから応答が返るまで処理を待ち受ける。 |
org.seasar.remoting.axis2.connector.AxisInOutConnector |
一方向形式
(Oneway) |
サービス処理の終了を待たずにクライアントの処理継続する。戻り値はなく、クライアントでは例外の検出もしない。 |
org.seasar.remoting.axis2.connector.AxisOnewayConnector |
diconファイルは、次のように記述します。
<!-- 同期型要求応答形式 -->
<component name="ioRemoting"
class="org.seasar.remoting.common.interceptor.RemotingInterceptor">
<property name="connector">ioConnector</property>
</component>
<component name="ioConnector"
class="org.seasar.remoting.axis2.connector.AxisInOutConnector">
<property name="baseURL">baseURL</property>
</component>
<!-- 一方向形式 -->
<component name="oneWayRemoting"
class="org.seasar.remoting.common.interceptor.RemotingInterceptor">
<property name="connector">oneWayConnector</property>
</component>
<component name="oneWayConnector"
class="org.seasar.remoting.axis2.connector.AxisOnewayConnector">
<property name="baseURL">baseURL</property>
</component>
<component name="baseURL" class="java.net.URL" autoBinding="none">
<arg>"http://localhost:8080/s2axis2-examples/services/"</arg>
</component>
|