2 Stimmen

Gibt es ein Muster für die Unternehmensintegration, um Elemente aus 2 Warteschlangen zu kombinieren?

Ich habe zwei Systeme, die verschiedene Arten von Nachrichten produzieren, die ich konsumieren und dann neue Nachrichten auf der Grundlage dieser Nachrichten generieren muss.

  • Die erste erzeugt NEWFILE-Nachrichten, die einen Dateinamen enthalten und in einer Warteschlange eintreffen warteschlange:datei.neu .

  • Die zweite erzeugt TASK-Nachrichten, die einen Dateinamen und einen Aufgabentyp enthalten, und geht zu warteschlange:aufgabe .

  • Es werden nur eine NEWFILE-Meldung für einen bestimmten Dateinamen.

  • Es werden mehrere TASK-Meldungen für einen bestimmten Dateinamen, jede mit einem anderen TaskType.

  • Die Nachrichten können in beliebiger Reihenfolge eintreffen.

Ich muss jede TASK-Nachricht, die auftaucht, weiterleiten an queue:perform pero nur wenn eine NEWFILE-Meldung für den entsprechenden Dateinamen eingetroffen ist.

Im Moment führen wir diesen Abgleich in einem anderen (nicht Warteschlangen-basierten) System durch, das Polling verwendet, um die DATEIEN und AUFGABEN zu finden, und zwei Tabellen verwaltet, eine für DATEIEN und eine für AUFGABEN, und wenn eine von beiden auftaucht, prüfen wir, welche Übereinstimmungen es gibt und feuern die entsprechende Aufgabe.

Wir möchten diese durch eine Messaging-Lösung ersetzen, bei der wir so wenig Status wie möglich beibehalten und so viel wie möglich von Enterprise Patterns (Apache Camel) Gebrauch machen.

Es ist mir nicht klar, welche Muster/Komponenten meinen Anforderungen entsprechen würden.

Danke, Tom

0voto

Redder Punkte 1348

Es scheint, dass Sie die Aggregator Muster. Sie können die verschiedenen Optionen der Komponente verwenden, um die Erledigungskriterien und die Korrelation zwischen den Meldungen anzugeben

Zum Beispiel zeigt die folgende Anforderung, dass Sie wahrscheinlich den Dateinamen auf Ihrer correlationExpression :

Es wird nur eine NEWFILE-Meldung geben für einen bestimmten Dateinamen. mehrere TASK-Meldungen für einen bestimmten Dateinamen

Um die Aufgaben zu bearbeiten, können Sie die Aufgabenmeldungen vorübergehend auf dem newExchange Objekt, und dann, wenn geeignet. können Sie die gespeicherten Nachrichten in ihre Zielwarteschlangen leeren. Ich glaube, Sie haben zwei Hauptoptionen für die geeignet. Moment:

  1. Warten auf tous die zusammenzufassenden Nachrichten eines bestimmten Kontexts (NEWFILE- und TASK-Nachrichten) unter Verwendung eines Abschlusskriteriums wie Größe, Zeitüberschreitung usw. Dazu können Sie z. B. die completionPredicate um zu beurteilen, ob der Kontext abgeschlossen ist oder nicht. Nach der Fertigstellung werden die Aufgaben an die folgende Warteschlange gesendet.

  2. Warten Sie, bis die NEWFILE-Meldung eintrifft, leeren Sie die temporär gespeicherten TASK-Meldungen in die Zielwarteschlange und warten Sie dann auf die verbleibenden TASK-Meldungen (wiederum unter Verwendung der entsprechenden Kriterien, die anzeigen, dass der Nachrichtenkontext beendet ist).

Ich habe das nicht im Code ausprobiert, aber ich glaube, dass die erste Option zwar einfacher ist, die zweite aber eine bessere Leistung bringt, denn da die TASK-Nachrichten so schnell wie möglich an die Ziel-Warteschlangen weitergeleitet werden, werden die ersten Aufgaben wahrscheinlich früher abgeschlossen als die letzten, während man im ersten Fall warten muss, bis alle Aufgaben produziert sind, und erst dann den Prozess startet. Da Sie außerdem die zwischengespeicherten Nachrichten so schnell wie möglich löschen, ist der Speicherbedarf im Vergleich zur ersten Option ebenfalls geringer. Das heißt, wenn Sie mit großen Nachrichten und großen Mengen zu tun haben, brauchen Sie weniger Speicher, wenn das nicht der Fall ist, sind beide Lösungen ähnlich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X