2017-10-23 1 views
1

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

Antwort

1

den Rückstand auf dem Werk Server-Verbindung zu erhöhen.

/** 
* 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; 
} 

Erhältlich in XML-Konfiguration mit dem Attribut 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

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. –