S2Axisの動的呼び出しで、タイムアウト値を設定

[2006/07/11 追記]
S2Axis 1.0.2にて、タイムアウト値の設定が可能になりました。

設定方法は、下記とほぼ同じになりますので、ぜひS2Axis 1.0.2をお使いください。

                                                                                                                                    • -


S2Axis(1.0.1)を使った動的呼び出しで、タイムアウト値を設定したいのですが、そのままではどうも設定できないようです。

今回は、Axis1.2.1を使っており、デフォルトのタイムアウト値は600秒になっていました。


AxisConnectorを元に、ちょこっと手を加えれば出来そうな雰囲気。タイムアウト値を指定出来るように変更してみます。

package test;

import java.lang.reflect.Method;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.rpc.Call;

import org.seasar.remoting.axis.S2AxisConstants;
import org.seasar.remoting.axis.connector.AxisConnector;

public class ExAxisConnector extends AxisConnector {

    /** time out */
    private Integer timeOut;

    /**
     * @see org.seasar.remoting.axis.connector.AxisConnector#invoke(
     *      java.net.URL, java.lang.reflect.Method, java.lang.Object[])
     */
    protected Object invoke(final URL targetURL, final Method method,
            final Object[] args) throws Throwable {
        final Call call = service.createCall();
        call.setTargetEndpointAddress(targetURL.toString());

        if (timeOut != null) {
            ((org.apache.axis.client.Call) call).setTimeout(timeOut);
        }

        call.setOperationName(new QName(
                S2AxisConstants.OPERATION_NAMESPACE_URI, method.getName()));
        return call.invoke(args);
    }

    /**
     * @return timeOut
     */
    public Integer getTimeOut() {
        return timeOut;
    }

    /**
     * @param timeOut
     *            timeOut
     */
    public void setTimeOut(Integer timeOut) {
        this.timeOut = timeOut;
    }
}

インスタンス変数としてtimeOutを定義し、AxisConnector#invokeの処理に下記の3行を付け加えただけです。

if (timeOut != null) {
    ((org.apache.axis.client.Call) call).setTimeout(timeOut);
}


diconファイルにて、タイムアウト値を指定して使います。
(下記の例だと1000*60*30で30分を指定)

<!-- Webサービスのプロキシ -->
<component name="Echo" class="org.seasar.remoting.axis.examples.ex01.Echo">
    <aspect>remoting</aspect>
</component>

<!-- リモート呼び出しのインターセプタ -->
<component name="remoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>

<!-- Axisコネクタ -->
<component name="connector" class="test.ExAxisConnector">
    <property name="baseURL">
        "http://localhost:8080/s2-axis-examples/services/"
    </property>
    <property name="timeOut">1000 * 60 * 30</property>
</component>

<!-- Axisサービス -->
<component class="org.apache.axis.client.Service" autoBinding="none"/>

長時間かかる場合は、タイムアウト値をのばすより、非同期呼び出し(処理終了時にコールバックしてもらう)にした方がいいかなぁと思う今日この頃です。