Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

Hallo, Habr! Dies ist eine Fortsetzung von mir vorherige Veröffentlichung, in dem ich über Optionen zum Platzieren von Nachrichten in Warteschlangen mithilfe von JMeter sprechen werde.

Wir bauen einen Datenbus für ein großes Bundesunternehmen. Verschiedene Anfrageformate, Transformationen, kompliziertes Routing. Zum Testen müssen Sie viele Nachrichten an die Warteschlange senden. Manuelle Eingriffe sind ein Schmerz, mit dem nicht jeder Chiropraktiker umgehen kann.

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

Einführung

Obwohl ich diese Schmerzen zunächst ertragen musste. Alles begann mit RFHUtil. Kraftvoll, aber umständlich und beängstigend: Nun, Sie kennen Rus.

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

Teilweise unverzichtbar, bei aktiver Nutzung jedoch stetig rückläufig.
Bequemes Testen ist damit nicht möglich.

Mit JMeter ist alles einfacher geworden. Nach der ersten Phase des Beherrschens und Eingewöhnens begann die Hoffnung auf ein glückliches Ausprobieren zu dämmern.

Ich nutze aktiv die Sampler JMS Publisher und JMS Subscriber. Im Gegensatz zu JMS Point-to-Point schien dieses Paar bequemer zu verwenden zu sein. Beispielsweise können Sie mit Subscriber im JMS Selector eine Variable angeben, mit Point-to-Point jedoch nicht (oder diese Methode ist nicht sehr offensichtlich).

Probenehmer vorbereiten

JMS-Herausgeber

  • Setup – Jede Probe. Apache empfiehlt Verwenden Sie diese Option, wenn Warteschlangen/Themen über Variablen angegeben werden.
  • Ablauf (ms) = 120000. Im Fehlerfall verschwinden Testanfragen nach 2 Minuten aus der Warteschlange.
  • Nicht persistenten Übermittlungsmodus verwenden? - WAHR. IBM AnsprücheDieser persistente Modus gewährleistet die zuverlässige Erhaltung der übertragenen Nachrichten im Falle eines plötzlichen Ausfalls. Und schnellerer Austausch im nicht persistenten Modus. Für Testzwecke ist die Geschwindigkeit wichtiger.

In jedem Publisher lege ich eine JMS-Eigenschaft fest, die der Abonnent im JMS-Selektor verwendet. Für jede Übermittlung wird im Testplanelement „Benutzerparameter“ ein Zufallswert generiert:

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

So können Sie sicher sein, dass die richtige Nachricht gelesen wird.

Das letzte „Leerzeichen“ eines vorkonfigurierten JMS Publisher:

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

JMS-Abonnent

  • Setup – Jede Probe. Nun, Sie verstehen.
  • Timeout (ms) = 100000. Wenn die Anfrage nach 100 Sekunden Wartezeit nicht in der Warteschlange ankommt, ist ein Fehler aufgetreten.
  • Zwischen den Proben anhalten? - WAHR.

JMS Selector – ganz praktisch Ding. Endgültiger JMS-Abonnent:

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

Umgang mit dem kyrillischen Alphabet in übermittelten Nachrichten. In JMeter wird es nach dem Korrekturlesen standardmäßig schief angezeigt. Um dies zu vermeiden und immer und überall das Große und Mächtige zu genießen, müssen Sie:

  1. Fügen Sie dem JMeter-„Launcher“ ein JVM-Argument hinzu:
    -Dfile.encoding=UTF-8
  2. Fügen Sie JSR223 PostProcessor zum Subscriber mit der groovigen Zeile hinzu:
    prev.setDataEncoding("UTF-8")

Text senden

Die faulste Option. Geeignet zum Debuggen frisch geschriebener Tests. Oder für den Fall, dass Sie zumindest etwas Kleines verschicken müssen. Wähle eine Option Nachrichtenquelle – Textbereich und platzieren Sie den Nachrichtentext in einem Textblock:

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

Dateiübertragung

Die häufigste Option. Geeignet für die meisten Szenarien. Wähle eine Option Nachrichtenquelle – Aus Datei und geben Sie den Pfad zur Nachricht im Feld an Datei - Dateiname:

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

Übertragen einer Datei in ein Textfeld

Die vielseitigste Option. Geeignet für die meisten Szenarien + kann in JMS Point-to-Point verwendet werden, wo es keine zweite Sendeoption gibt:

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

Übergabe eines Byte-Arrays

Die schwierigste Option. Geeignet zur Überprüfung der unfehlbar präzisen Übertragung von Anfragen bis auf das Byte, ohne Verzerrungen, SMS und Störungen. Dies ist im Standard-JMeter nicht möglich. hier Mir wurde auf jeden Fall davon erzählt.

Also musste ich herunterladen Quellen und modifizieren Code JMS-Abonnent.

In der Methode ersetzt extractContent(..) Linie:

buffer.append(bytesMessage.getBodyLength() + " bytes received in BytesMessage");

на:

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 neu erstellt.

Jetzt müssen nur noch ein paar JSR223-Sampler hinzugefügt werden. Die erste besteht darin, vor dem Publisher/Subscriber-Paar 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:temprandomBytes.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 Schritt besteht darin, am Ende des Skripts die Datei zu löschen:

import java.io.File;

File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();

Und vergessen Sie nicht, den Pfad zur Datei in Publisher hinzuzufügen:

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

Und auch eine Prüfung in JSR223 Assertion für Abonnenten – vergleichen Sie die Quellbytes mit denen, die in der Warteschlange des Empfängers ankommen:

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

Abschluss

Ich habe vier Möglichkeiten beschrieben, Nachrichten an Warteschlangen zu senden, die ich jeden Tag in der Praxis verwende. Ich hoffe, dass diese Informationen Ihr Leben einfacher machen. Als Fortsetzung möchte ich über meine Erfahrungen beim Testen einer Börse sprechen, bei der sich an einem Ende eine Warteschlange und am anderen Ende eine Datenbank oder ein Dateisystem befindet.

Sparen Sie Zeit. Und vielen Dank für Ihre Aufmerksamkeit.

Warteschlangen und JMeter: Teilen mit Herausgeber und Abonnenten

Source: habr.com

Kommentar hinzufügen