info@yenlo.com
ned
Menu
WSO2 8 min

WSO-2-EASY: Werken met properties

Rob Blaauboer
Rob Blaauboer
Integration Consultant & WSO2 Trainer
wso2 easy

Als ontwikkelaar ben je gewend om met variabelen te werken. Je gebruikt ze om tijdelijke informatie op te slaan, het aantal voorvallen te tellen, enzovoort. Binnen de WSO2 Micro Integrator (en natuurlijk de Enterprise Integrator) kun je ook properties gebruiken. Niet alleen voor de eerder genoemde doeleinden, maar ook om wijzigingen in de messagecontext aan te brengen, bijvoorbeeld van XML naar JSON en omgekeerd. Dit gebeurt met de property mediator, die de messagecontext niet rechtstreeks wijzigt, maar waarmee je wel bepaalde properties daarvan kunt wijzigen.

Er zijn heel wat verschillende eigenschappen beschikbaar om te gebruiken en in te stellen. Een paar voorbeelden:

•Generieke properties zoals OUT_ONLY (er wordt geen antwoord verwacht)
•HTTP Transport properties zoals FORCE_SC_ACCEPTED (er wordt een statuscode 202 gegenereerd)
•SOAP Headers zoals To en From
•Axis2 properties zoals het CacheLevel voor JMS objectsSynapse Message Context Properties zoals SYSTEM_DATE of MESSAGE_FORMAT

Je kunt deze properties bijvoorbeeld gebruiken in de MAIN sequence om op een gebruikersvriendelijke manier in te loggen bij het aanroepen van een niet-bestaande proxy (de MAIN sequence verzamelt alle calls naar de Micro Integrator als er geen proxy is gedefinieerd, bv. door een verkeerde naam van een service).  Zie de WSO2-documentatie voor een volledige lijst van eigenschappen.can use these properties for instance in the MAIN sequence to log in a user-friendly way when a non-existing proxy was called (the main sequence will gather all calls to the Micro Integrator where there is no proxy defined, e.g., wrong service name).  For a complete list of properties see the WSO2 documentation.

Property Mediator

De property mediator wordt gebruikt om properties in te stellen of te verwijderen. Hieronder vind je syntax van deze mediator. Het type is niet beperkt tot string, maar ook integer, boolean enzovoort. Er is meer informatie online te vinden. Bedenk welke scope je moet gebruiken. Sommige eigenschappen worden gedefinieerd binnen de axis2 scope. Dit betekent dat je ze bijvoorbeeld definieert op een inSequence zoals een messageType

WSO2 EASY - werken met properties

De algemene syntax is als volgt:

<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>

Wat we echter zien in de documentatie is dat de lijst van scopes groter is dan beschreven in de syntax.

Scope weergave

Je kunt niet al deze scopes selecteren in de properties-weergave van Integration Studio. We hebben een issue ingediend in de github repository.

We zullen niet alle mogelijke use cases beschrijven, maar ons concentreren op het instellen en uitlezen van properties in de registry en op de berichtenstroom (default / synapse scope en axis2 scope).

In het onderstaande voorbeeld wordt de waarde van de TestValue Axis2 opgehaald en naar de console gelogd.

<log level="custom"> 

<property expression="get-property('axis2','TestValue Axis2')" name="SETProperty Axis2"/>

</log>

Vanuit het perspectief van de properties van de Property Mediator ziet de Testvalue Axis2 er als volgt uit:

Property Mediator Testvalue Axis2

Er bestaat zelfs een mogelijkheid om waarden in te stellen en op te vragen die zijn opgeslagen in de conf en governance registries die, in het geval van de Micro Integrator, bestandsgebaseerde registries zijn waardoor ze gemakkelijker toegankelijk zijn. Voor de volledigheid: de Enterprise Integrator heeft een database waarin gegevens uit het registry in een aantal tabellen worden opgeslagen. Vanuit het oogpunt van ontwikkeling en uitrol is er echter weinig verschil. Alleen de manier waarop de gegevens worden opgeslagen en de configuratie wordt geregeld, is anders.

Test proxy

Hier is de ontwerpweergave van de Test proxy. Wanneer je overschakelt naar de broncode zie je dat deze code een waarde opslaat in de governance registry en de waarde in de console plaatst.

<?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>

De Log mediator toont de waarde in de console.

[2022-10-20 11:02:17,769]  INFO {LogMediator} – {proxy:Test} Value = Testing

LogMediator Proxy Test

Maar we hebben nog meer mogelijkheden. Deze code creëert ook een registerbron, maar de waarde na de @ wordt beschouwd als de sleutel van een sleutel-waardepaar.

<?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>

Zoals je hieronder kunt zien, is value.txt nu een bestand met properties en heeft de @key een sleutel-waardepaar gecreëerd. De Log mediator toont de waarde in de console.

[2022-10-20 10:53:02,013]  INFO {LogMediator} – {proxy:Test} Value = Testing

LogMediator testing value

Scopes

De manier om de waarde van een propery te krijgen is met het commando get-property. Er kunnen twee variabelen worden meegegeven, de scope en de naam van de property. Als de scope wordt weggelaten, wordt er uitgegaan van de standaardscope (Synapse).

Omdat je een property met een scope definieert. De standaardscope is Synapse. Hierdoor kan de waarde kan worden behouden zolang de berichtafhandeling binnen de specifieke bericht-scope plaatsvindt. Dergelijke properties zijn alleen zichtbaar voor de huidige bericht-scope en hebben geen invloed op andere berichten. Een variabele die in de axis2 scope is gedefinieerd, blijft alleen bestaan in de reeks in, out of fault, afhankelijk van waar hij is gedefinieerd.

Als er een scope wordt gebruikt waarvoor geen property met die naam is gedefinieerd, wordt een nulwaarde teruggegeven. Het definiëren van een property op de verkeerde scope werkt niet, bijvoorbeeld het instellen van een header op iets anders dan de transport scope levert niet het gewenste resultaat op.

Echo services Enterprise Integrator

Dit is de broncode van bovenstaande code, geschreven voor Enterprise Integrator (het gebruikt een standaard Echo service):

<?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>

If you want to try it out on the Micro Integrator, you need to either change the endpoint to a service that gives a response or create the simplest proxy of all: only a respond mediator.

EchProxy Micro Integrator
<?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"?>

Dit is natuurlijk omdat Micro Integrator niet de Echo service bevat.

Een voorbeeld

Om dit duidelijk te maken hebben we een eenvoudige proxy gemaakt die de Echo axis2 service van de EI aanroept. We stellen in deze proxy twee properties in, TestValue Axis2 en TestValue Synapse, elk binnen de scope die door de naam wordt aangegeven. We implementeren deze proxy naar de Enterprise Integrator als een CAR-bestand. Met SoapUI roepen we de uitgerolde TestProxy aan. Het antwoord is een eenvoudige echo van het bericht dat we naar de proxy sturen, maar de interessante dingen gebeuren eigenlijk in de console.

Voorbeeld log statements

De twee log statements zetten de werkelijke waarde van de property in de console.

Zoals je kunt zien, is de op Synapse-niveau gedefinieerde waarde zowel in zowel de in- als de outSequence beschikbaar. De Axis2 gedefinieerde variabele is null in de Outsequence.

[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 IN

Wanneer je een call mediator in de In Sequence gebruikt, wordt de waarde van axis2 ook gewist, ook al zit je nog steeds in de inSequence.

Properties zijn handig om variabelen op te slaan en om de context van het bericht te veranderen. Als je de inhoud van een bericht wilt wijzigen, kijk dan naar onze blog over de PayloadFactory mediator.

Als je wilt leren hoe je dergelijke proxies kunt ontwikkelen en uitrollen, bekijk dan onze trainingspagina’s.

ned
Sluiten