Als Entwickler sind Sie mit der Verwendung von Variablen vertraut. Sie werden zur Speicherung temporärer Informationen, zum Zählen von Ereignissen usw. verwendet. Im WSO2 Micro Integrator (und natürlich auch im Enterprise Integrator) können Sie zudem Eigenschaften verwenden. Und zwar nicht nur für die eben genannten Zwecke, sondern auch, um Änderungen am Nachrichtenkontext vorzunehmen – z. B. den Wechsel von XML zu JSON und umgekehrt. Hierfür wird der Property Mediator verwendet, der den Nachrichtenkontext nicht direkt ändert, sondern eine Änderung bestimmter zugehöriger Eigenschaften ermöglicht.
Es gibt eine ganze Reihe verschiedener Eigenschaften, die Sie verwenden und einstellen können. Einige Beispiele:
•Allgemeine Eigenschaften wie OUT_ONLY (es wird keine Antwort erwartet)
•HTTP-Transporteigenschaften wie FORCE_SC_ACCEPTED (ein 202-Statuscode wird erzeugt)
•SOAP-Header wie To und From
•Axis2-Eigenschaften wie CacheLevel für JMS-ObjekteSynapse-Nachrichtenkontexteigenschaften wie SYSTEM_DATE oder MESSAGE_FORMAT
Sie können diese Eigenschaften z. B. in der MAIN Sequence verwenden, um auf benutzerfreundliche Weise zu protokollieren, wenn ein nicht vorhandener Proxy aufgerufen wurde (die Main Sequence sammelt alle Aufrufe an den Micro Integrator, für die kein Proxy definiert ist, wie z. B. ein falscher Servicename). Eine vollständige Liste der Eigenschaften finden Sie in der WSO2-Dokumentation.
Property Mediator
Der Property Mediator wird verwendet, um Eigenschaften einzustellen oder zu entfernen. Im Folgenden finden Sie die Syntax dieses Mediators. Der Typ ist nicht auf String beschränkt, sondern umfasst auch Integer, Boolean und so weiter. Weitere Informationen finden Sie online. Denken Sie daran, welchen Scope Sie verwenden müssen. Einige Eigenschaften werden im Axis2 Scope definiert, so dass Sie sie z. B. in einer inSequence wie einen messageType definieren.
Die allgemeine Syntax lautet wie folgt:
<property name="string" [action=set|remove] [type="string"] (value="literal" | expression="xpath") [scope=default|transport|axis2|axis2-client] [pattern="regex" [group="integer"]]>
<xml-element/>?
</property>
Aus der Dokumentation geht jedoch hervor, dass die Liste der Scopes größer ist als in der Syntax beschrieben.
Außerdem lässt Integration Studio nicht zu, dass alle Scopes in der Eigenschaftsansicht ausgewählt werden können. Wir haben ein Problem im Github-Repository eingereicht.
Wir werden nicht alle möglichen Anwendungsfälle beschreiben, sondern uns auf das Einstellen und Lesen von Eigenschaften im Registry und im Nachrichtenfluss (Default / Synapse Scope und Axis2 Scope) konzentrieren.
Im folgenden Beispiel wird der Wert von TestValue Axis2 abgerufen und in der Console angezeigt.
<log level="custom">
<property expression="get-property('axis2','TestValue Axis2')" name="SETProperty Axis2"/>
</log>
From the perspective of the Properties of the Property Mediator the Testvalue Axis2 looks like this
Es besteht sogar die Möglichkeit, Werte einzustellen und abzurufen, die in den Registrys Conf und Governance gespeichert sind. Im Falle des Micro Integrators sind sie dateibasiert und daher leichter zugänglich. Der Vollständigkeit halber möchten wir erwähnen, dass der Enterprise Integrator über eine Datenbank verfügt, in der die Registry-Daten in einer Reihe von Tabellen gespeichert sind. Aus der Sicht der Entwicklung und Bereitstellung gibt es jedoch kaum einen Unterschied. Nur die Art und Weise, wie die Daten gespeichert und die Konfiguration geregelt wird, unterscheidet sich.
Hier sehen Sie die Entwurfsansicht des Test-Proxys. Wenn Sie zum Quellcode wechseln, sehen Sie, dass dieser Code einen Wert im Governance Registry speichert und den Wert in der Console ausgibt.
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="Test" startOnLoad="true" transports="http https" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<property name="gov:myvalues/value.txt" scope="registry" type="STRING" value="Testing"/>
<log level="custom">
<property expression="get-property('registry','gov:myvalues/value.txt')" name="Value"/>
</log>
<respond/>
</inSequence>
<outSequence/>
<faultSequence/>
</target>
</proxy>
Der Log Mediator zeigt den Wert in der Console an.
[2022-10-20 11:02:17,769] INFO {LogMediator} – {proxy:Test} Value = TestingAber wir haben noch mehr Möglichkeiten. Dieser Code erstellt ebenfalls eine Registry-Ressource, aber der Wert nach dem @ wird als Schlüssel eines Schlüssel-Wert-Paares betrachtet.
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="Test" startOnLoad="true" transports="http https" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<property name="gov:myvalues/value.txt@key" scope="registry" type="STRING" value="Testing"/>
<log level="custom">
<property expression="get-property('registry','gov:myvalues/value.txt@key')" name="Value"/>
</log>
<respond/>
</inSequence>
<outSequence/>
<faultSequence/>
</target>
</proxy>
Wie Sie nachfolgend sehen können, ist value.txt nun eine Eigenschaftsdatei und @key hat ein Schlüssel-Wert-Paar erstellt. Der Log Mediator zeigt den Wert in der Console an.
[2022-10-20 10:53:02,013] INFO {LogMediator} – {proxy:Test} Value = TestingScopes
Der Wert einer Eigenschaft kann mit dem Befehl get-property ermittelt werden. Dafür werden zwei Befehle, der Scope und der Eigenschaftsname benötigt. Wenn der Scope nicht angegeben wird, wird der Default Scope (Synapse) zugrunde gelegt.
Denn Sie definieren eine Eigenschaft mit einem Scope. Der Default Scope ist Synapse, d. h. der Wert wird so lange erhalten, wie die Nachrichtenverarbeitung innerhalb des jeweiligen Nachrichtenkontexts läuft. Diese Eigenschaftsarten sind nur für den aktuellen Nachrichtenkontext sichtbar und wirken sich nicht auf andere Nachrichten aus. Eine im Axis2 Scope definierte Variable bleibt je nachdem, wo sie definiert wurde, nur in der inSequence, outSequence oder faultSequence bestehen.
Wenn ein Scope verwendet wird, in dem keine Eigenschaft mit diesem Namen definiert ist, wird ein Nullwert zurückgegeben. Das Definieren einer Eigenschaft für den falschen Scope funktioniert nicht – z. B. führt das Einstellen eines Headers für einen anderen als den Transport Scope nicht zum gewünschten Ergebnis.
Das ist der Quellcode des oben dargestellten Codes, der für den Enterprise Integrator geschrieben wurde (er verwendet einen Standard-Echo-Dienst):
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="TestProxy" startOnLoad="true" transports="http https" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<property name="TestValue Axis2" scope="axis2" type="STRING" value="GOING IN"/>
<property name="TestValue Synapse" scope="default" type="STRING" value="GOING IN"/>
<log level="custom">
<property name="Value IN" value="Static value"/>
<property expression="get-property('axis2','TestValue Axis2')" name="SETProperty Axis2"/>
<property expression="get-property('TestValue Synapse')" name="SETProperty Synapse"/>
</log>
<send>
<endpoint>
<address uri="http://localhost:8280/services/echo">
<suspendOnFailure>
<initialDuration>-1</initialDuration>
<progressionFactor>1</progressionFactor>
</suspendOnFailure>
<markForSuspension>
<retriesBeforeSuspension>0</retriesBeforeSuspension>
</markForSuspension>
</address>
</endpoint>
</send>
</inSequence>
<outSequence>
<log level="custom">
<property name="Value OUT" value="Static value"/>
<property expression="get-property('axis2','TestValue Axis2')" name="SETProperty Axis2"/>
<property expression="get-property('TestValue Synapse')" name="SETProperty Synapse"/>
</log>
<send/>
</outSequence>
<faultSequence/>
</target>
</proxy>
Wenn Sie das im Micro Integrator ausprobieren möchten, müssen Sie entweder den Endpunkt in einen Dienst ändern, der eine Antwort gibt, oder den einfachsten Proxy von allen erstellen: nur einen Respond Mediator.
<?xml <?xml version="1.0" encoding="UTF-8"?>
<proxy name="EchoProxy" startOnLoad="true" transports="http https" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<respond/>
</inSequence>
<outSequence/>
<faultSequence/>
</target>
</proxy>
version="1.0" encoding="UTF-8"?>
Das liegt vor allem daran, dass der Micro Integrator den Echo-Dienst nicht integriert hat.
Ein Beispiel
Zur Verdeutlichung haben wir einen einfachen Proxy erstellt, der den Echo-Axis2-Dienst des EI aufruft. In diesem Proxy stellen wir zwei Variablen ein – TestValue Axis2 und TestValue Synapse. Jede Variable wird mit dem Scope versehen, der durch den Namen angegeben wird. Dieses Proxy wird als CAR-Datei an den Enterprise Integrator übermittelt. Mit SoapUI rufen wir den verwendeten TestProxy auf. Die Antwort ist ein einfaches Echo der Nachricht, die wir an den Proxy senden, aber das eigentlich Interessante passiert in der Console.
Die beiden Log-Anweisungen zeigen den aktuellen Wert der Variablen in der Console an.
Wie Sie sehen können, ist der auf der Synapse-Ebene definierte Wert sowohl in der inSequence als auch in der outSequence verfügbar. Die definierte Axis2-Variable ist in der outSequence null.
[2021-09-07 16:35:14,674] INFO {org.apache.synapse.mediators.builtin.LogMediator} – Value IN = Static value, SETProperty Axis2 = GOING IN, SETProperty Synapse = GOING IN [2021-09-07 16:35:14,686] INFO {org.apache.synapse.mediators.builtin.LogMediator} – Value OUT = Static value, SETProperty Axis2 = null, SETProperty Synapse = GOING INWenn Sie einen Call Mediator in der inSequence verwenden, wird der Axis2-Wert ebenfalls gelöscht, obwohl Sie sich noch in der inSequence befinden.
Eigenschaften sind praktisch, um Variablen zu speichern und den Kontext der Nachricht zu ändern. Wenn Sie den Inhalt einer Nachricht ändern möchten, lesen Sie unseren Blog über den PayloadFactory-Mediator.
Wenn Sie lernen möchten, wie man solche Proxys entwickelt und einsetzt, besuchen Sie am besten unsere Schulungsseiten.