

Axis2の非同期送信についてご質問があります。  
以下のソースでシンプルなサービス（文字列を返すだけのサービス）に対して  
Axis2の非同期送信を利用してｎ回繰り返し実行するようなクライアントプログラムを作成しております。  
想定では、ｎ回ログを出力後、正常終了すると思っていましたが、  
現在は「java.lang.OutOfMemoryError: unable to create new native
thread」と出て異常終了してしまいます。

非同期送信＋後処理に関してはAxis2の範疇でスレッド生成→スレッド解放してくれると思ってましたが、実際は違うのでしょうか？

クライアント側のソースでスレッドが解放されない理由等がありましたらご教示いただけると幸いでございます。  
※Axis2の非同期送信のスレッド解放ができないのであれば、自前でExecutorServiceを構えて同期送信する方向に切り替えます。。

■サービス側ソースコード

[code]

    public class Echo {
    
        public String getEcho( String message ) {
            return message + "Echo!!!";
        }
    
    }
    
[/code]

■クライアント側ソースコード

[code]

    public class EchoTestAsync {
    
        public int cnt = 0;
    
        public static void main(String[] args){
    
            System.out.println( "開始！" );
    
            System.out.println("Async 処理開始 " + Thread.activeCount());
            EchoTestAsync instance = new EchoTestAsync();
            instance.execute();
            System.out.println("Async 処理終了 " + Thread.activeCount());
    
            while( instance.getCnt() != 0  ) {
    
                try {
                    Thread.sleep(1000l);
                } catch (InterruptedException e) {
                    // TODO 自動生成された catch ブロック
                    e.printStackTrace();
                }
    
            }
    
            System.out.println( "終了！" );
        }
    
        public int getCnt() {
            return cnt;
        }
    
        public void execute(){
    
            try {
    
                for(int i=0;i<5000;i++){
                    cnt++;
    
                    EchoStub stub = new EchoStub();
    
                    GetEcho req = new GetEcho();
    
                    req.setMessage( "Async" );
    
                    EchoCallbackHandler callback = new EchoCallbackHandler() {
                        @Override
                        public void receiveResultgetEcho(GetEchoResponse result) {
                            System.out.println("Async callback " + result.get_return() );
                            cnt--;
                        }
                        @Override
                        public void receiveErrorgetEcho(Exception e) {
                            System.out.println("Async callback error " + e.getMessage() );
                            cnt--;
                        }
                    };
    
                    System.out.println("Async sta " + Thread.activeCount() );
    
                    stub._getServiceClient().getOptions().setTimeOutInMilliSeconds(1000);
                    stub.startgetEcho( req, callback );
    
                    System.out.println("Async end " + Thread.activeCount() );
    
                }
    
            } catch (AxisFault e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            } catch (RemoteException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
        }
    
    }
    
[/code]


CC BY-SA 3.0
2016-09-06T06:23:26.810
28718
2016-09-07T02:22:58.243
18707
question
java
Axis2の非同期送信について


あなたの使っているOSは何ですか？

> java.lang.OutOfMemoryError: unable to create new native thread

このエラーメッセージが出るときは、ほとんどはJavaのコードの問題ではなく、OSの最大スレッド数の設定が原因です。MacまたはLinuxを使っているのなら、

[code]

    $ ulimit -u
    
[/code]

でOSの"max user
processes"の設定値が分かります。あなたのクライアントコードを見ると5000回ループをしているので、クライアントコードをそのままで動作させたいなら`ulimit
-u`の値は5000以上は必要になるでしょう。

（ちなみに、現行Mac OS X 10.11までは、`ulimit
-u`の値は最大でも2500までにカーネル側で制限されているようです。クライアントコードをそのまま動かしたいなら、OS X
Serverを使うか、Linuxを使う必要があります。）

参考までに、英語版StackOverflowの同じ問題についてのリンクです。  
<https://stackoverflow.com/questions/16789288/java-lang-outofmemoryerror-
unable-to-create-new-native-thread>


CC BY-SA 3.0
2016-09-07T01:25:41.070
28731
2016-09-07T01:25:41.070
2017-05-23T12:38:56.083
-1
244
28718
answer


ご質問の件ですが、現在の試験環境はWindows7ですが、本番環境としてはLinuxを想定しております。  
ですが、そもそも先程のサンプルソースでなぜthreadが解放されないのか不明のため、このアーキテクチャを採用するかどうか懸念しております。

やりたいこととしましては、  
・Webサービスに非同期送信  
・現在はサンプルで5000としてますが、技術的に可能であれば10,000～100,000件程度できないものかと期待

上記を実現する際に  
・Axis2の非同期送信を採用  
・送信箇所をthread化してExecutorServiceにて実行（送信処理は同期）  
のいずれかかと思っております。

何か情報がありましたら、ご教示願います。


CC BY-SA 3.0
2016-09-07T02:05:44.417
28732
2016-09-07T02:22:58.243
2016-09-07T02:22:58.243
18707
18707
28718
answer