Ich habe ein Spring Integration-Projekt, das TCP-Nachrichten verarbeitet.Spring Integration TCP-Verbindung abgelehnt unter Multithread Load/Stresstest
Das einfachste Szenario ist die PING-Nachricht (msg von der Quelle empfängt und zurück Echo), die Strömung im SI-Projekt ist wie folgt:
1) Nachricht von der Quelle empfangen wird (durch eine tcp-Inbound- Tor). Die Quelle schließt den Socket nach jeder Nachricht.
2) Ein Transformator analysiert die Nachricht und setzt (unter anderem) einen Kopfwert mit dem Antwortkanalnamen
3) ein Header-Wert-Router über die Nachricht leitet sie an die Quelle zurück, die angewandt wird.
XML config (vereinfachte Version) unter:
<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"/>
Es funktioniert ok von einem funktionellen pov, wenn Nachrichten manuell aufrufen, aber es funktioniert nicht unter Stresstests. Sobald ich über 15 Threads hochgefahren bin (jeder Thread, der eine for-Schleife ausführt, die 10 Nachrichten sendet), erhalte ich java.net.ConnectException: Connection refused: connect für etwa 20% der Versuche.
Der Code-Schnipsel von dem Threads verwendet, um die msg zu senden:
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;
}
Fehler:
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)
Die Anforderungen sagt, dass es mit 60 Fäden laufen muß. Irgendwelche Ideen, was ich tun kann, um dieses Problem zu lösen? Ich habe versucht, eine Aufgabe: Executor ID = "threadPoolTaskExecutor" Pool-Größe = "5-10" Warteschlange-Capacity = "100" Ablehnungs-Richtlinie = "CALLER_RUNS" auf der Fabrik, aber dies hat das Problem nicht gelöst.
Jede Beratung ist sehr
geschätzt
Vielen Dank, es funktionierte. Es wird dringend empfohlen, die "Erhöhung, wenn hohe Verbindungsraten erwartet werden" zur Attributbeschreibung des Backlogs https://docs.spring.io/spring-integration/reference/html/ip.html hinzuzufügen. Danke noch einmal. –