2017-10-23 52 views
1

私は、TCPメッセージを処理するSpring Integrationプロジェクトを持っています。Spring Integration TCP接続がマルチスレッドロード/ストレステストで拒否されました

最も単純なシナリオでは、(ソースからMSGを受信し、それをエコーバック)PINGメッセージで次のように、SIプロジェクトの流れは、次のとおり

1)メッセージは、TCP-inbound-により(ソースから受信されますゲートウェイ)。ソースは各メッセージの後にソケットを閉じます。

2)変圧器は、メッセージおよびとりわけセット()Aヘッダー価値ルータがそのソースへのルートをメッセージ上に適用される応答チャンネル名

3)とヘッダー値を解析します。

XML設定(簡易版)は以下の通りです:

<int-ip:tcp-connection-factory id="TCP_SRV" 
           type="server" 
           port="${router.port}" 
           using-nio="true" 
           single-use="true" 
           serializer="CustomSerializer" 
           deserializer="CustomSerializer"/> 

<int-ip:tcp-inbound-gateway request-channel="rawInputFromSource" 
          reply-channel="outputBackToSource" 
          connection-factory="TCP_SRV"/> 

<int:channel id="rawInputFromSource"/> 

<int:transformer ref="inputFromSourceTransformer" 
       input-channel="rawInputFromSource" 
       output-channel="processedInputFromSource"/> 

<int:channel id="processedInputFromSource"/> 

<bean id="inputFromSourceTransformer" class="my.org.InputFromSourceTransformer"/> 

<int:header-value-router input-channel="processedInputFromSource" 
         header-name="RouteToChannel"/> 

メッセージを手動で起動するときは、機能POVから[OK]を動作しますが、それはストレステストの下で失敗します。一度私は15スレッド(各スレッドは、10メッセージを送信するためのループを実行して)をランプアップjava.net.ConnectException:接続が拒否されました:試みの約20%を接続

MSGを送信するために、スレッドによって使用されるコードスニペットは:

byte[] sendAndReceive(byte[] data){ 
    byte[] result = new byte[data.length]; 
    try { 
     Socket socket=new Socket("localhost", SI_PORT); // here is where the err occurs 
     OutputStream output = socket.getOutputStream(); 
     InputStream input = socket.getInputStream(); 
     output.write(data); 
     input.read(result); 
     socket.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return result; 
} 

エラー:

java.net.ConnectException: Connection refused: connect 
at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) 
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
at java.net.Socket.connect(Socket.java:589) 
at java.net.Socket.connect(Socket.java:538) 
at java.net.Socket.<init>(Socket.java:434) 
at java.net.Socket.<init>(Socket.java:211) 
at my.org.PerformanceTest.sendAndReceive(PerformanceTest.java:98) 

要件は、それが60個のスレッドを通過しなければならないと言います。この問題を解決するために何ができるのですか? タスクを追加しようとしました:executor id = "threadPoolTask​​Executor" pool-size = "5-10" queue-capacity = "100" reject-policy = "CALLER_RUNS"工場出荷時にはこれで問題は解決されませんでした。

アドバイスありがとうございます。

答えて

1

サーバー接続ファクトリのバックログを増やしてください。 backlog属性を持つXML構成で利用可能

/** 
* The number of sockets in the connection backlog. Default 5; 
* increase if you expect high connection rates. 
* @param backlog The backlog to set. 
*/ 
public void setBacklog(int backlog) { 
    Assert.isTrue(backlog >= 0, "You cannot set backlog negative"); 
    this.backlog = backlog; 
} 

...

<xsd:attribute name="backlog" type="xsd:string"> 
    <xsd:annotation> 
     <xsd:documentation> 
      Specifies the connection backlog for server sockets. Does not 
      apply to client factories. 
     </xsd:documentation> 
    </xsd:annotation> 
</xsd:attribute> 
+0

どうもありがとう、それが働きました。バックログ属性の説明https://docs.spring.io/spring-integration/reference/html/ip.htmlに「接続率が高いと思われる場合は増加する」を追加することを強くお勧めします。再度、感謝します。 –

関連する問題