【Axi2】Axis2のライフサイクル (Lifecycle/ServiceLifeCycle) ~サービス編~

■ 知識

ライフサイクルの管理について

 * ライフサイクルの管理には、以下の2つのインターフェースが用意されている。
~~~
 [1] Lifecycle
 [2] ServiceLifeCycle
~~~
 * 詳細は以下のサイトを参照のこと。
http://ogawa.s18.xrea.com/tdiary/20081210.html

Service設定(services.xml)

http://axis.apache.org/axis2/java/core/docs/axis2config.html#Service_Configuration
 * scopeの値によって、Lifecycleで実装した init() / destroy() のタイミングが異なる
~~~
 [1] application
 [2] soapsession
 [3] transportsession
 [4] request(デフォルト値)
~~~

■ Lifecycle

http://axis.apache.org/axis2/java/core/apidocs/org/apache/axis2/service/Lifecycle.html

環境設定

 [01] Eclipseにおいて、[File]-[New]-[Dynamic Web Project]を選択
 [02] New Dynamic Web Project設定画面において、[Project Name]に 「SampleServiceWithLifecycle」と入力する
 [03] New Dynamic Web Project設定画面において、「Dynamic web module version」を「2.5」 (3.0だとできない)に選択
 [04] New Dynamic Web Project設定画面において、「configuration」欄にある「Modify」ボタン押下し、
      「Axis2 Webservice」にチェックボタンをつけ、「OK」押下
 →手順[03]で「3.0」を設定すると、「Axis2 Webservice」にチェックボタンをつけた際にエラーとなる

 [05] Package と クラスを作成
     * Package : com.sample
     * class   : SampleServiceWithLifecycle

 [06] プロジェクトを右クリックで、[Properties]-[Java Build Path]-[Libraries]で「Add External JARs」を選択
 [07] Axis2のLib配下のJARファイルを全て追加する
 [08] webサービスのソースを書く(下記「サンプルソース」を参照のこと)
 [09] 作成したクラスのファイルを右クリックし、[Web Service]-[Create Web Service]を選択し、「Finish」を押下

サンプル

service.xml(serviceタグ の scope="application" に注目)
<serviceGroup>
<service name="SampleServiceWithLifecycle" scope="application">
    <Description>This is a sample service</Description>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass" locked="false">com.sample.SampleServiceWithLifecycle</parameter>
</service>
</serviceGroup>
SampleServiceWithLifecycle.java
package com.sample;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceContext;
import org.apache.axis2.service.Lifecycle;

public class SampleServiceWithLifecycle implements Lifecycle {
	private static final String Key = "COUNT";
	
	/**
	 * サービスクラスのインスタンスが作られた際
	 */
	@Override
	public void init(ServiceContext arg0) throws AxisFault {
		System.out.println("init");
	}

	/**
	 * サービスクラスのインスタンスが用済みになった際
	 */
	@Override
	public void destroy(ServiceContext arg0) {
		System.out.println("destroy");
	}

	public int getCount() {
		ServiceContext serviceContext = MessageContext.getCurrentMessageContext().getServiceContext();
		Integer returnValue = (Integer)serviceContext.getProperty(SampleServiceWithLifecycle.Key);
		if (returnValue == null) {
			returnValue = new Integer(0);
		}
		++returnValue;
		serviceContext.setProperty(SampleServiceWithLifecycle.Key, returnValue);
		System.out.println("COUNT = " + serviceContext.getProperty(SampleServiceWithLifecycle.Key));
		return returnValue;
	}
}
http://blogs.yahoo.co.jp/dk521123/32750213.html
に続く

■ ServiceLifeCycle

http://axis.apache.org/axis2/java/core/apidocs/org/apache/axis2/engine/ServiceLifeCycle.html

サンプル

service.xml(serviceタグ の classにサービスのクラスを設定する)
<service name="SampleServiceWithServiceLifeCycle" class="com.sample.SampleServiceWithServiceLifeCycle">
  <Description>
    Please Type your service description here
  </Description>
  <messageReceivers>
    <messageReceiver
    mep="http://www.w3.org/ns/wsdl/in-only"
    class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
    <messageReceiver
    mep="http://www.w3.org/ns/wsdl/in-out"
    class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
  </messageReceivers>
  <parameter name="ServiceClass" locked="false">com.sample.SampleServiceWithServiceLifeCycle</parameter>
</service>
com.sample.SampleServiceWithServiceLifeCycle.java
package com.sample;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceContext;
import org.apache.axis2.service.Lifecycle;

public class SampleServiceWithLifecycle implements ServiceLifeCycle {
	private static final String Key = "COUNT";
	
	/**
	 * サービスクラスのインスタンスが作られた際
	 */
	@Override
	public void startUp(ConfigurationContext arg0, AxisService arg1) {
		System.out.println("startUp");
	}

	/**
	 * サービスクラスのインスタンスが用済みになった際
	 */
	@Override
	public void shutDown(ConfigurationContext arg0, AxisService arg1) {
		System.out.println("shutDown");
	}

	public int getCount() {
		ServiceContext serviceContext = MessageContext.getCurrentMessageContext().getServiceContext();
		Integer returnValue = (Integer)serviceContext.getProperty(SampleServiceWithLifecycle.Key);
		if (returnValue == null) {
			returnValue = new Integer(0);
		}
		++returnValue;
		serviceContext.setProperty(SampleServiceWithLifecycle.Key, returnValue);
		System.out.println("COUNT = " + serviceContext.getProperty(SampleServiceWithLifecycle.Key));
		return returnValue;
	}
}

参考文献

http://wso2.com/library/333/
http://java6.blog117.fc2.com/blog-entry-41.html

関連記事

EclipseAxis2 を設定する

* 環境設定でほぼ同じ
http://blogs.yahoo.co.jp/dk521123/31944955.html

Axis2 で、Tomcat の 開始 / 停止イベントを拾うには

http://blogs.yahoo.co.jp/dk521123/34600183.html