2017-07-27 1 views
2

nehmen kann Ich habe eine BizTalk-Orchestrierung, die Nachrichten von einem MSMQ abholt. Es verarbeitet die Nachricht und sendet sie an ein anderes System.Wie BizTalk nur eine Nachricht auf einmal von der MSMQ

Die Sache ist, wenn eine Nachricht in die Warteschlange gestellt wird, entfernt BizTalk es sofort, auch wenn es noch die vorherige Nachricht verarbeitet. Das ist ein echter Schmerz, denn wenn ich die Orchestrierung neu starte, werden alle unverarbeiteten Nachrichten gelöscht.

Gibt es eine Möglichkeit, BizTalk nur jeweils eine Nachricht zu nehmen, damit die Verarbeitung der Nachricht vollständig abgeschlossen wird, bevor die nächste Nachricht genommen wird?

Tut mir leid, wenn dies eine offensichtliche Frage ist, habe ich ein BizTalk-System geerbt und kann die Antwort online nicht finden.

+0

Können Sie Ihre Schmerzen Punkt etwas mehr erklären? Was meinst du mit Neustart Orchestrierung? Ist es Hostinstanz neu starten? Es sollte nie einen Nachrichtenverlust verursachen. Es scheint, als ob Sie diese Verarbeitung aufgrund eines anderen zugrunde liegenden Problems einführen möchten. –

Antwort

0

Sie können die Nachrichten zwar in der Reihenfolge verarbeiten, in der Sie die Bestellbestellung verwenden, es gibt jedoch keine Möglichkeit, auf die von Ihnen gewünschte Weise zu serialisieren.

Durch bloßes Stoppen der Orchestrierung sollte jedoch nichts gelöscht werden, geschweige denn "alle unverarbeiteten Nachrichten". Scheint, dass du ein Problem hast.

Sie sollten die Verarbeitung stoppen können, ohne etwas zu verlieren.

Wenn die Orchestrierung wird in einen Zustand Abgehängte, dann alles, was Sie tun müssen, ist Lebenslauf dass eine Orchestrierung und alle Nachrichten in der Warteschlange bleiben und weiterverarbeitet werden. Dies wäre das Standardverhalten, selbst wenn die App versehentlich "korrekt" erstellt wurde;).

Wenn Sie die Anwendung stoppen, terminieren Sie tatsächlich die vorhandene Orchestrierung und alles, was damit verbunden ist, einschließlich aller Nachrichten in der Warteschlange.

Hier ist Ihr mögliches Problem, wenn der ursprüngliche Entwickler den Portfehler nicht richtig behandelt hat, könnte die Orchestrierung in einem nicht finalisierbaren Loop stecken bleiben. Das würde einen (sehr kleinen) Mod für die Orchestrierung selbst erfordern.

+0

Ich vermute, der Code wurde schlecht geschrieben, aber wir unterstützen nur die Anwendung und wir haben keine Fähigkeiten mehr, den Code zu ändern. Manchmal kommt es zu wiederholten Fehlern (zB weil das Downstream-System nicht reagiert) und die Orchestrierung protokolliert eine Nachricht, dass sie suspendiert ist und wir die Orchestrierung neu starten müssen. Wenn wir das tun, beginnt es wieder zu arbeiten, aber alle unverarbeiteten Nachrichten, die es aus der Warteschlange entfernt hat, werden gelöscht. –

+0

Wir tun dies, indem wir die Anwendung neu starten. Ich habe gerade nachgesehen und tatsächlich scheint es, wir können nur die Orchestrierung neu starten? Sollten wir das stattdessen tun? –

+0

@ChrisWignall Antwort basierend auf Kommentar aktualisiert. –

1

Es gibt drei Eigenschaften des BizTalk Adapter MSMQ Sie könnten versuchen, zu spielen, um:

Batchsize

Gibt die Anzahl der Nachrichten, die der Adapter die Warteschlange zu einer Zeit ab. Der Standardwert ist 20.

Dies kann oder kann nicht helfen. Selbst wenn ich auf 1 setze, vermute ich, dass BTS versuchen wird, die verbleibenden "einzelnen" Nachrichten gleichzeitig zu konsumieren, da es immer die Parallelverarbeitung versucht, aber ich kann mich darin irren.

serialProcessing

Gibt Nachrichten in der Reihenfolge aus der Warteschlange entfernt werden sie die Warteschlange eingereiht wurden. Der Standardwert ist falsch.

Dies ist eher hilfreich, da Sie zur Gewährleistung einer geordneten Verarbeitung grundsätzlich auf die Verarbeitung mit einem Thread beschränkt sind. Ich bin mir jedoch nicht sicher, ob dies alleine ausreicht oder ob es nur die Reihenfolge der Nachrichtenzustellung an die Nachrichtenbox-Datenbank vermittelt. Möglicherweise müssen Sie die geordnete Lieferung auch in der gesamten BTS-Anwendung aktivieren, was nur zur Entwurfszeit erfolgen kann (d. H. Codeänderungen erfordern).

Transaktions

Gibt an, dass Nachrichten an die Datenbank Message-Box als eine DTC-Transaktion Teil gesendet werden. Der Standardwert ist falsch.

Dies wird wahrscheinlich mit Ihrem anderen Problem helfen, wo Nachrichten "verloren gehen". Wenn die Warteschlange nicht transaktional ist und darüber hinaus nicht in einem größeren Transaktionsbereich eingetragen ist, der bis zur Nachrichtenbox-DB reicht, führt dies zu einem Nachrichtenverlust, wenn Nachrichten aus der Warteschlange genommen, aber nicht verarbeitet werden. Indem der gesamte Prozess unteilbar gemacht wird, werden alle Nachrichten, die nicht an das Nachrichtenfeld gebunden sind, in die Warteschlange zurückgesetzt.

Quellen: https://msdn.microsoft.com/en-us/library/aa578644.aspx

Verwandte Themen