2017-02-02 1 views

Antwort

1

Ja, es ist possibe, aber Sie werden es in Ihrem Strom entwickeln müssen. MQ ist für die asynchrone Kommunikation ausgelegt, daher ist eine Zeitüberschreitung nicht für sie typisch. Ich kann jetzt von zwei möglichen Lösungen denkt:

  • die TimeoutControl Nutzung und TimeoutNotification Knoten in Ihrem Strom

Im Fluss, den die Anforderung sendet, nachdem die Anfrage Sie einen TimeoutControl Knoten hinzufügen Senden und einrichten das gewünschte Zeitlimit Erstellen Sie einen neuen Flow, der mit dem TimeoutNotification-Flow beginnt. In diesem Ablauf senden Sie Ihren Zeitüberschreitungsfehler, wenn die Antwort noch nicht empfangen wurde. Und um zu wissen, welche Antwort empfangen wurde, können Sie verschiedene Methoden verwenden, zum Beispiel könnten die Flüsse, die die Anfrage senden und die Antwort erhalten, eine Datenbanktabelle verwalten, oder Sie könnten diese Informationen auch in einer Warteschlange speichern.

  • Start für die Antwort zu warten, nachdem die Anfrage zu senden

den Antwort-Handler Fluss beginnen mit einem MQ Eingang gefolgt von einer MQ Get Knoten einrichten. Sie hören auf die Antwort mit dem MQ Get, auf dem Sie ein Warteintervall festlegen können, das Ihre Zeitüberschreitungsschwelle sein wird. Die MQ-Eingabe erhält technische Nachrichten, die nach dem Senden der Anforderung vom Nachrichtenfluss des Anforderungsservers gesendet werden. Dies ist eine schlechtere Lösung als die erste, da Sie einen Nachrichtenfluss-Thread blockieren, während Sie auf die Antwort warten.

Oder Sie können nur 1 Fluss machen, um die Anfrage zu senden und die Antwort zu erhalten, erhalten die Antwort mit einem MQ Get-Knoten. Dies ist noch schlimmer, da Sie die Transaktionalität für die MQ-Ausgabe, die die Anforderung sendet, deaktivieren müssen.

+0

Attila, bitte klären Sie eine Sache. Wenn wir das erste Szenario verwenden, haben wir 3 Flüsse. Eins mit Anfrage, eins mit TimeoutNotification und eins mit Antwortbehandlung, oder? Beispiel: Die Anfrage wurde erfolgreich ausgeführt, die Antwort wurde empfangen, aber der Timer wird weiter ausgeführt und eine Nachricht an TimeoutNotification gesendet. Dann wird der Fehler trotzdem gesendet, wenn ich das richtig verstehe. Wie man es vermeidet? –

+0

Korrekt, Sie haben 3 Flüsse. In Ihrem Anfragefluss müssen Sie speichern, auf welche Nachrichten-IDs Sie eine Antwort warten. Und Sie entfernen die ID, wenn Sie die Antwort erhalten. Ihr Timeout-Flow sendet also nur den Fehler, wenn Sie ein Timeout mit einer MsgId erhalten, die in der Liste ist. Der TimeoutControl-Knoten kann Daten speichern, die an den TimeoutNotification-Knoten gesendet werden. In diesen Daten können Sie die MsgId der Nachricht speichern, für die Sie das Timeout starten. Und die Liste der MsgIds, auf die Sie eine Antwort warten, kann auf die am besten geeignete Art in einem DB, in einem Q oder in geteilten Variablen gespeichert werden. –

Verwandte Themen