Hallo Habr!
Dies ist eine Fortsetzung meiner
vorherigen Veröffentlichung , in der ich über die Optionen zum Platzieren von Nachrichten in Warteschlangen mit JMeter sprechen werde.
Wir machen einen Datenbus für eine große Bundesgesellschaft. Verschiedene Abfrageformate, Konvertierungen, kompliziertes Routing. Zum Testen müssen Sie viele Nachrichten in der Warteschlange senden. Manuell - ein Schmerz, mit dem nicht jeder Handwerker fertig wird.

Einführung
Obwohl ich diesen Schmerz zuerst ertragen musste. Alles begann mit RFHUtil. Kraftvoll, aber unangenehm und beängstigend:
Nun, Sie kennen Rus.
In einigen Fällen unverzichtbar, bei aktiver Nutzung jedoch stabil fallend.
Bequeme Tests mit ihm sind unmöglich.
Mit JMeter wurde es einfacher. Nach der ersten Phase des Meisterns und Gewöhnens kam die Hoffnung auf ein glückliches Testen.
Ich verwende aktiv die JMS Publisher- und JMS Subscriber-Sampler. Im Gegensatz zu JMS Point-to-Point schien es für dieses Paar bequemer zu sein, mit ihm zu arbeiten. Beispielsweise können Sie in JMS Selector eine Variable für Subscriber für Point-to-Point - no angeben (oder diese Methode ist nicht allzu offensichtlich).
Probenvorbereitung
JMS Publisher
- Setup - Jede Probe. Apache empfiehlt die Verwendung dieser Option, wenn Warteschlangen / Themen über Variablen angegeben werden.
- Ablauf (ms) = 120000. Im Fehlerfall verschwinden Testanforderungen nach 2 Minuten aus der Warteschlange.
- Nicht persistenten Zustellungsmodus verwenden? - wahr. IBM behauptet, dass der persistente Modus eine zuverlässige Persistenz von Nachrichten im Falle eines plötzlichen Ausfalls bietet. Und schnellere Freigabe im nicht persistenten Modus. Für Testzwecke ist die Geschwindigkeit wichtiger.
In jedem Publisher habe ich die jms-Eigenschaft festgelegt, die der Abonnent in der JMS-Auswahl verwendet. Für jede Sendung wird im Testplanelement Benutzerparameter ein zufälliger Wert generiert:

So können Sie sicher sein, dass die richtige Nachricht gelesen wurde.
Das endgültige "Leerzeichen" des vorkonfigurierten JMS Publisher:

JMS-Abonnent
- Setup - Jede Probe. Nun, du verstehst, worum es geht.
- Zeitüberschreitung (ms) = 100000. Wenn die Anforderung nach 100 Sekunden Wartezeit nicht in die Warteschlange eingeht, ist ein Fehler aufgetreten.
- Zwischen Probe anhalten? - wahr.
JMS Selector ist eine ziemlich praktische
Sache . Zusammenfassung JMS-Abonnent:

Umgang mit dem kyrillischen Alphabet in übertragenen Nachrichten. In JMeter wird standardmäßig nach der Subtraktion schief angezeigt. Um dies zu vermeiden und die Großen und Mächtigen immer und überall zu genießen, brauchen Sie:
- Fügen Sie das JVM-Argument zum JMeter-Starter hinzu:
-Dfile.encoding=UTF-8
- Fügen Sie dem Abonnenten JSR223 PostProcessor mit einer Zeile auf groovy hinzu:
prev.setDataEncoding("UTF-8")
Textübertragung
Die faulste Option. Geeignet zum Debuggen frisch geschriebener Tests. Oder für Fälle, in denen Sie zumindest etwas Kleines senden müssen. Wählen Sie die Option
Nachrichtenquelle - Textbereich und platzieren Sie den Nachrichtentext in einem Textblock:

Dateiübertragung
Die häufigste Option. Geeignet für die meisten Szenarien. Wählen Sie die Option
Nachrichtenquelle - Aus Datei und geben Sie den Pfad zur Nachricht im Feld
Datei - Dateiname an:
Datei in Textfeld übertragen
Die vielseitigste Option. Geeignet für die meisten Szenarien + kann in JMS Point-to-Point verwendet werden, in dem es keine zweite Sendeoption gibt:

Byte-Array-Übertragung
Die schwierigste Option. Geeignet zur Überprüfung der unfehlbar genauen Übertragung von Anforderungen an das Byte ohne Verzerrung, SMS und Störung. Ich kann dies im Standard-JMeter nicht tun,
hier haben sie mir definitiv davon erzählt.
Daher musste ich die
Quellen herunterladen und
den JMS-Abonnentencode ändern.
Ersetzte die Zeile in der Methode
extractContent(..)
:
buffer.append(bytesMessage.getBodyLength() + " bytes received in BytesMessage");
am:
byte[] bytes = new byte[(int) bytesMessage.getBodyLength()]; bytesMessage.readBytes(bytes); try { buffer.append(new String(bytes, "UTF-8")); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); }
und JMeter wieder aufgebaut.
Es bleiben noch ein paar JSR223-Sampler hinzuzufügen. Das erste ist vor dem Publisher / Subscriber-Paar, um eine .dat-Datei mit zufälligen Bytes zu erstellen:
import org.apache.commons.lang3.RandomUtils; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; vars.put("PATH_TO_BYTES", "C:\\temp\\randomBytes.dat"); File RESULT_FILE = new File(vars.get("PATH_TO_BYTES")); byte[] arr = RandomUtils.nextBytes((int)(Math.random()*10000)); try { FileOutputStream fos = new FileOutputStream(RESULT_FILE); fos.write(arr); fos.close(); } catch (IOException e) { System.out.println("file not found"); }
Der zweite am Ende des Skripts löscht die Datei:
import java.io.File; File RESULT_FILE = new File(vars.get("PATH_TO_BYTES")); RESULT_FILE.delete();
Vergessen Sie nicht, den Pfad der Datei von Publisher hinzuzufügen:

Und auch eine Überprüfung in der JSR223-Zusicherung für Abonnenten - vergleichen Sie die Quellbytes mit denen, die in der Warteschlange des Empfängers stehen:
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; Path path = Paths.get(vars.get("PATH_TO_BYTES"), new String[0]); byte[] originalArray = Files.readAllBytes(path); byte[] changedArray = ctx.getPreviousResult().getResponseData(); System.out.println(changedArray.length); if (Arrays.equals(originalArray, changedArray)) { SampleResult.setResponseMessage("OK"); } else { SampleResult.setSuccessful(false); SampleResult.setResponseMessage("Comparison failed"); SampleResult.setResponseData("Bytes have changed","UTF-8"); IsSuccess=false; }
Fazit
Er beschrieb vier Möglichkeiten, Nachrichten in einer Warteschlange zu senden, die ich in der Praxis jeden Tag verwende. Ich hoffe, diese Informationen erleichtern Ihnen das Leben. In der Folge möchte ich über meine Erfahrungen beim Testen des Austauschs sprechen, wobei sich an einem Ende die Warteschlange und am anderen die Datenbank oder das Dateisystem befindet.
Pass auf deine Zeit auf. Und danke fürs Zuschauen.