[Seasar-user:18619] [S2Axis2]マルチスレッドで同時にサービス呼び出しを行った際にスレッド間で同期してしまう
山田太郎
[E-MAIL ADDRESS DELETED]
2009年 10月 9日 (金) 13:31:53 JST
初めて投稿さていただきます。山田と申します。
S2Axis2について質問がございます。
クライアント側で同期型要求応答形式のAxisコネクタ(AxisInOutConnector)を使用しているのですが、
マルチスレッドで同時にサービス呼び出しを行った際に、リモートサーバ側で逐次処理されてしまいます。
【例】s2axis2-examples のorg.seasar.remoting.axis2.examples.ex01を改造したものです。
その他の設定はそのままです。
■サーバ側
public class EchoImpl implements Echo {
public String echo(int id, String message) {
System.out.println("---start server---" + id);
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("---end server---" + id);
return "[id = " + id + "] " + message;
}
}
■クライアント側
public class EchoClient extends Thread {
private Echo service;
public void run() {
int id = (int)System.currentTimeMillis();
String msg = "echo message";
System.out.println("=============start=============" + id);
service.echo(id, msg);
System.out.println("=============end=============" + id);
}
public void setEcho(Echo echo) {
this.service = echo;
}
public static void main(String[] args) {
SingletonS2ContainerFactory.setConfigPath("org/seasar/remoting/axis2/examples/ex01/EchoTest.dicon");
SingletonS2ContainerFactory.init();
S2Container container = SingletonS2ContainerFactory.getContainer();
Echo echo1 = (Echo)container.getComponent(Echo.class);
Echo echo2 = (Echo)container.getComponent(Echo.class);
EchoClient client1 = new EchoClient();
EchoClient client2 = new EchoClient();
client1.setEcho(echo1);
client2.setEcho(echo2);
client1.start();
client2.start();
}
}
・EchoClient を実行すると、
=============start=============スレッド1
=============start=============スレッド2
---start server---スレッド1
---end server---スレッド1
=============end=============スレッド1
---start server---スレッド2
---end server---スレッド2
=============end=============スレッド2
のようになってしまいます。
・期待していたのは、
=============start=============スレッド1
=============start=============スレッド2
---start server---スレッド1
---start server---スレッド2
---end server---スレッド1
---end server---スレッド2
=============end=============スレッド1
=============end=============スレッド2
のように、スレッド1の応答を待たずにスレッド2の処理も行ってほしいのですが
スレッド間でも同期を取るような仕様なのでしょうか?
それとも、s2axis2-client.dicon の設定(もしくはそのほかのdicon)を変更しなければならないのでしょうか?
※instance="prototype" に変更してみたのですが、うまくいきませんでした。
<component name="ioConnector"
class="org.seasar.remoting.axis2.connector.AxisInOutConnector"
instance="prototype" >
・また、要件としてサーバ側でも並列処理を行わなければならないので、
s2axis2-client.dicon の設定で何とかならない場合は、
org.seasar.remoting.axis2.connector.AbstractRPCConnector#invoke
のsynchronizedブロックをはずすという対応を検討をしているのですが、
それが最善の方法なのでしょうか?
(接続先は1つしかないので、Optionsの競合は問題ない?と考えているのですが・・)
以上、宜しくお願い致します。
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20091009/a26ad5dc/attachment.html>
Seasar-user メーリングリストの案内