Messaging mit dem Service Bus ermöglicht die...

Read more

Sebastian Meyer, Microsoft & SAP...

Read more

Für Entwickler, Architekten, Projektleiter und...

Read more

In der Welt der Softwareentwicklung ist die...

Read more

QUIBIQ spendet für den guten Zweck – und für...

Read more

Eine bestimmte Antwort auf einen HTTP Request zu...

Read more

In einer Welt, die von stetigem Wandel geprägt...

Read more

In einem unserer Kundenprojekte, war das Ziel eine...

Read more

QUIBIQ Hamburg wird mit dem Hamburger...

Read more

Zwei Tage lang wurde vom 14.-15.11 wieder das...

Read more

How-to: Retrieve Acknowledgement in BizTalk Orchestration for oneway file Sendport with direct binding (via MessageBox)

In diesem Blogeintrag werden wir kurz erläutern, was notwendig ist, um eine Transport-Bestätigung für eine indirekt (direkt Binding an Message Box) auf eine File Location versendete Nachricht innerhalb der Orchestration zu empfangen und diese auszuwerten.

Szenario 1: Orchestration bedient bekannte Anzahl an Subscriber

Wir haben eine BizTalk Orchestration, die über ein direct Binding eine Nachricht mit einer promoteten Property an die Message Box legt. Der zugehörige (One-way) File-Sendport holt sich die Nachricht ab und versendet sie. Bei dieser Implementierung darf nur ein Nachrichten-Subscriber vorhanden sein! Bei einer höheren Anzahl an bekannten Subscribern müsste diese Funktionalität in einer Loop aufgerufen werden.

Ziel ist es nun, eine Rückmeldung zu bekommen, um verifizieren zu können, dass die Nachricht erfolgreich im Zielpfad abgelegt wurde.

Um dies zu erreichen, müssen folgende Properties zusätzlich beim Versenden aus der Orchestration über Correlation-Sets initialisiert werden:

Wir erstellen nun also folgende Correlation-Types:

  • CT_AckRequired
    • Beinhaltet die BTS.AckRequired Property
  • CT_CorrelationToken
    • Beinhaltet die BTS.CorrelationToken Property
  • CT_SPName
    • Beinhaltet die BTS.SPName Property

Basierend auf diesen Correlation Types erstellen wir nun drei Correlation-Sets:

  • CS_AckRequired
    • Basierend auf CT_AckRequired
  • CS_CorrelationToken
    • Basierend auf CT_CorrelationToken
  • CS_SPName
    • Basierend auf CT_SPName

Anschließend initialisieren wir die Properties im Message Assignment Shape:

Und initialisieren diese beim Versenden:

Nun sind wir an dem Punkt, an dem die Nachricht aus der Orchestration versendet wird. Um jetzt das Ack auf die Nachricht nachvollziehen zu können, benötigen wir ein Receive Shape, welches dem Correlation Set (welches das Correlation Token beinhaltet) folgt. Da jedoch die versendete Nachricht selbst ebenfalls das Correlation Token promoted im Kontext beinhaltet, muss dieses in einer parallelen Aktion ausgeführt werden (um 1x die versendete Nachricht und 1x das Acknowledgement empfangen zu können).
Dies sieht so aus:

  • Receive Shape 1 folgt CS_CorrelationToken und empfängt Nachricht msgAckCandidate1 ( XmlDokument )
  • Receive Shape 2 folgt CS_CorrelationToken und empfängt Nachricht msgAckCandidate2 ( XmlDokument )

In einer der beiden Nachrichten steckt später die versendete Nachricht selbst und in der anderen das Acknowledgement.
Um jetzt herauszufinden, welche der beiden Nachrichten der Ack ist, prüfen wir den Kontext der Nachricht auf die Eigenschaft BTS.AckType in einem Entscheidungsshape:

  • Bedingung Zweig Candidate 1
    • BTS.AckType exists msgAckCandidate1
  • Bedingung Zweig Candidate 2
    • BTS.AckType exists msgAckCandidate2

Innerhalb des Zweigs wird ein Message Assignment ausgeführt, bei dem der AckCandidate in die „reale“ Ack Nachricht (ebenfalls XmlDokument) überführt wird (z.B. msgAck = msgAckCandidate1).
Zum Schluss muss noch geprüft werden, ob das Acknowledgement positiv oder negativ war.

  • Positiv = „ACK“
  • Negativ = „NACK“

Dies wird in einem abschließenden Entscheidungsshape geprüft und dementsprechend reagiert:

  • Bedingung Zweig True
    • msgAck(BTS.AckType) == "NACK"
  • Orchestration terminated with uncosumed messages

 

Szenario 2: Orchestration bedient unbekannte Anzahl an Subscriber

Dieses Ausgangsszenario würde z.B. wie folgt aussehen:

Wir haben eine BizTalk Orchestration, die über ein direct Binding eine Nachricht mit einer promoteten Property an die Message Box legt. Die zugehörigen (One-way) File-Sendports holen sich die Nachricht ab und versenden sie.

Das würde bedeuten, dass pro Sendport eine Acknowledgement Nachricht zurück an die Messagebox gelegt wird und die Orchestration im oben beschriebenen Aufbau nicht in der Lage ist, all diese Nachrichten zu verarbeiten, da sie lediglich auf 1 Ack/Nack wartet.

Hierfür wäre es empfehlenswert, eine dedizierte Orchestration anzulegen, die nur die Aufgabe hat, die Acknowledgment-Nachrichten zu sammeln und auszuwerten.

 

Dieser quiTeq-Tipp kommt aus Stuttgart von Nico.

© QUIBIQ GmbH · Imprint · Data protection