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