Was sind Workflow Selectors?
Mit Workflow Selectors (im Folgenden Selektoren) ist es möglich, Nachrichten und Aktionen mit Filterkategorien zu versehen.
Ein positiver Selektor an einer Aktion bewirkt, dass diese Aktion nur für Nachrichten angewendet wird, welche mit diesem Selektor versehen sind. Ein negativer Selektor an einer Aktionbewirkt, dass diese Aktion für Nachrichten, welche mit diesen Selektor versehen sind, nicht ausgeführt wird.
Es ist möglich mehrere Selektoren an eine Nachricht, bzw. eine Aktion zu vergeben, dabei haben negative Selektoren Vorrang vor positiven Selektoren. Mehrere Selektore werden kommasepariert angegeben, negative Selektoren werden durch ein vorangestelltes “!” kenntlich gemacht
Beispiel
Eine Aktion ist mit den Selektoren “WORKFLOW_NEU, !UTILMD” versehen.
Eine Nachricht mit dem Selektor “UTILMD” wird von der Aktion nicht bearbeitet, die Aktion wird übersprungen.
Eine Nachricht mit dem Selektor “WORKFLOW_NEU” wird von der Aktion bearbeitet.
Eine Nachricht mit dem Selektor “WORKFLOW_NEU, AndererSelektor” wird von der Aktion bearbeitet, da der Selektor WORKFLOW_NEU definiert ist. (Oder-Verknüpfung von Selektoren)
Eine Nachricht ohne Selektoren wird von der Aktion nicht bearbeitet.
Eine Nachricht mit den Selektoren “WORKFLOW_NEU, UTILMD” wird nicht bearbeitet, da der negative Selektor “!UTILMD” an der Aktion Vorrang vor dem positiven Selektor hat.
Ein negativer Selektor an einer Nachricht ist nicht sinnvoll. Die Bezeichnung eines Selektor darf nicht mit “!” beginnen.
Voraussetzung
Für die Benutzung der Workflow Selectors sollte zusätzlich das MessageRestartFeature genutzt werden. Dazu muss die GlobalProperty RESTART_UTIL_SAVE_MESSAGES_RESTARTABLE auf true gesetzt werden. Weiteres in der entsprechenden Dokumentation: Save Messages Restartable
Wofür kann man Workflow Selectors verwenden?
Selektoren können verwendet werden, um etwa verschiedene Nachrichtenversionen auf einem Channel korrekt zu verarbeiten. Dies erhöht die Komplexität der Channelverarbeitung, ermöglicht aber im Gegenzug einen parallelen Betrieb ohne die Definition neuer Channels.
Beispiel
Die Umstellung der Validierungslogik in der B2B zum Formatwechsel am 01.10.2014 führt dazu, dass die Verarbeitung auf den Kanälen angepasst werden muss. Aus der Verarbeitungsreihenfolge NLCAction, CONTRLAction, AperakAction für die alten Formate wird nun die Reihenfolge ValidatorAction, ContrlActionStandard, AperakAction21a, NLCAction2.
Wenn nun alle neuen Nachrichten beispielsweise mit dem Selektor “FORMATE_201410” versehen werden, und alle alten Nachrichten mit dem Selektor “FORMATE_201404”, dann kann durch Definieren der entsprechenden Selektoren an den Aktionen erreicht werden, dass die neuen Nachrichten nur durch die neu definierten Aktionen verarbeitet werdenn, wenn diese ebenfalls mit dem Selektor “FORMATE_201410” versehen sind.
Wie vergibt man Selektoren an Nachrichten?
Ein Selektor kann an eine Nachricht vergeben werden, indem man das MessageContext-Attribut B3P_WORKFLOW_SELECTOR_MESSAGE setzt.
In der Extension B3P_WORKFLOW_SELECTORS wird die automatische Vergabe von Selektoren an Nachrichten definiert. Die Definition erfolgt in der üblichen Properties-Syntax. Dabei gibt der Schlüssel der Property den Selektor an. Der Selektor (Schlüssel der Property) darf nicht mit einem ! beginnen. Der Wert der Property gibt die Bedingung an.Trifft die Bedingung zu, so wird der Schlüssel der Property als Selektor gesetzt. Der resultierende Selektor wird dann im Attribut B3P_WORKFLOW_SELECTOR_MESSAGE dem MessageContext hinzugefügt.
Für den Wert der Property, also die Bedingung, können template-Ausdrücke (dynamische Funktionen)verwendet werden. Das Resultat des Ausdruckes sollte allerdings immer “true” oder “false” sein.
Möglich sind hierfür die dynamischen Funkeionen equals(a,b) und greaterthan(code,a,b). Equals: ${equals(template_ausdruck,vergleichswert)} - Hier ist es möglich, als ersten Parameter wieder einen template-Ausdruck (siehe Beispiel) zu verwenden. Es wird vergleichen, ob der template-Ausdruck als Ergebnis den Vergleichswert liefert. Dynamische Funktion equals
greaterthan:
${greaterthan(vergleichstyp,a,b)} - Hier wird geprüft, ob a > b gilt.
lessthan:
${lessthan(vergleichstyp,a,b)} - Hier wird geprüft, ob a < b gilt.
Als Vergleichstyp wird DATE gewählt. Der Parameter muss ein Datum in folgendem Format sein: yyyyMMddHHmm.Es können als Parameter b die Werte B3P_OBJ_MESSAGE und B3P_BASE_MESSAGE_RECEIVED gewählt werden. Aus den entsprechenden Variablen wird dann das Nachrichtendatum gelesen. Dynamische Funktion greaterThan
Beispiel
Beispiel B3P_WORKFLOW_SELECTORS
FORMATE_201410=${equals(${template(&(this.FORMAT.type)_&(this.FORMAT.version))},UTILMD_5.1B)}
FORMATE_201410=${equals(${template(&(this.FORMAT.type)_&(this.FORMAT.version))},MSCONS_2.2C)}
FORMATE_201404=${equals(${template(&(this.FORMAT.type)_&(this.FORMAT.version))},UTILMD_5.1A)}
FORMATE_201404=${equals(${template(&(this.FORMAT.type)_&(this.FORMAT.version))},MSCONS_2.2B)}
...
MY_UNCHECKED_SYSTEM=${equals(&(this.FORMAT.SenderCode),9800043909)}
...
DIFFICULT_PARTNER=${equals(&(this.FORMAT.PartnerCode),9934534059345)}
...
AFTER_201410=${lessthan(DATE,201409011100,B3P_OBJ_MESSAGE)}
oder
BEFOR_201410=${greaterthan(DATE,201409011100,B3P_BASE_MESSAGE_RECEIVED)}
Wichtig: Semikolons in den Bedingungen müssen mit zwei Backslashes escaped werden: “\\;”, zum Beispiel
CSVFormat=${regex(Format\\;Datum,${template(&(this.CURRENT_PAYLOAD))})}
Übergabe von zwei Template Ausdrücken an die ${equals}-Funktion
${equals(…)}-Function Equals: ${equals(template_ausdruck,template_ausdruck)} Resultat: true oder false
Bei der equals-Funktion ist es möglich zwei template-Ausdrücke (siehe Beispiel) zu verwenden. Es wird vergleichen, ob die ausgewerteten Ergebnisse der template-Ausdrücke gleich sind.
Beispiel mit einem Template-Ausdruck und fixem Vergleichswert:
MY_UNCHECKED_SYSTEM=${equals(&(this.FORMAT.SenderCode),9800043909)}
DIFFICULT_PARTNER=${equals(&(this.FORMAT.PartnerCode),9934534059345)}
Beispiel mit zwei Template-Ausdrücken:
MY_UNCHECKED_SYSTEM=${equals(&(this.FORMAT.SenderCode), ${regex(Format\\;Datum,${template(&(this.CURRENT_PAYLOAD))})})}
DIFFICULT_PARTNER=${equals(&(this.FORMAT.PartnerCode), ${regex(Format\\;Datum,${template(&(this.CURRENT_PAYLOAD))})})}
Wie setzt man Selektoren an Aktionen?
An der Aktion wird eine Eigenschaft B3P_WORKFLOW_SELECTOR_ACTION gesetzt. Der Wert dieser Eigenschaft sind die einzelnen Selektoren, mit Komma separiert. Sollen Nachrichten mit einem bestimmten Selektor nicht von der Aktion verarbeitet werden, so wird dieser als negativer Selektor mit einem “!” davor in der Liste eingetragen.
Beispiel
Einschränkung des Workflow Selectors auf Nachrichten bestimmter Formatrepräsentationen
Wenn die Selektoren nur für bestimmte Nachrichten wie z.B. Edifact benutzt werden sollen kann man dies über die Global Property B3P_WORKFLOW_SELECTORS_ACCEPTED_PRESENTATIONS vorgeben.
Global Property |
B3P_WORKFLOW_SELECTORS_ACCEPTED_PRESENTATIONS |
Werte |
Formatrepräsentationen |
Trenner |
,; |
Beispiel |
xml;edi;csv |
Property nicht gesetzt |
selbes Verhalten wie vorher, Ausführung für alle Formatrepräsentationen |
Leerer Wert |
für keine Formatrepräsentationen ausführen (Workflow Selectors ausgeschaltet) |
Abbruch Verhalten bei Fehlerhaften Workflow Selectoren
Wenn man die Global Property ABORT_ON_WORKFLOW_SELECTOR_ERROR auf false stellt geht die Nachrichten Verarbeitung weiter wenn ein Fehler auftritt bei der Auswertung eines Workflow Selector (aus der Extension B3P_WORKFLOW_SELECTORS). Der Default der Global Property ist true.
View Me Edit Me