私は、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 = "threadPoolTaskExecutor" pool-size = "5-10" queue-capacity = "100" reject-policy = "CALLER_RUNS"工場出荷時にはこれで問題は解決されませんでした。
アドバイスありがとうございます。
どうもありがとう、それが働きました。バックログ属性の説明https://docs.spring.io/spring-integration/reference/html/ip.htmlに「接続率が高いと思われる場合は増加する」を追加することを強くお勧めします。再度、感謝します。 –