[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 メーリングリストの案内