Hoewel het niet vaak komt, zijn er soms integraties die moeilijk te bouwen zijn met standaard mediators. Geen zorgen, want de WSO2’s ESB heeft daar een oplossing voor.
Natuurlijk kun je altijd je eigen op maat gemaakte mediator bouwen, want java geeft je de controle bijna volledig in handen, maar wellicht zijn er eenvoudigere manieren om de klus te klaren. Zoals we vaak zeggen: “Binnen WSO2 is er altijd wel een andere manier om hetzelfde te doen.”
De Script Mediator
De script mediator is een handige tool die de opties van de WSO2 ESB behoorlijk kan uitbreiden als andere dingen niet werken, maar het struikelblok is vooral dat het debuggen niet altijd even makkelijk werkt.
In deze blog laat ik een klein voorbeeld zien van hoe stringmanipulatie in zijn werkt gaat wanneer je de WSO2 ESB en de script mediator gebruikt. Dat doe ik door de stappen één voor één uit te leggen.
Stringmanipulatie
Omdat we toegang nodig hebben tot de berichtcontext, kunnen we ook direct met de variabelen werken die het bericht kunnen inspecteren en veranderen.
In dit voorbeeld gebruik ik stringmanipulatie om een header in te voegen, die bijvoorbeeld een ‘versie’ bevat die later vervangen zou kunnen worden op basis van een eerdere teruggehaalde ‘versie’. Als er een versie gegeven is, dan wordt het {version}-element van de URL vervangen door de huidige versie. (Dit is een specifiek voorbeeld, want normaal zijn er andere meer praktische manieren om dit te doen). Als er geen versie gegeven is, dan wordt het /{version}-element van de URL verwijderd.
<script language="js">
var toheader = mc.getProperty('retrieved_url');
var log = mc.getServiceLog();
log.info(toheader);
var back = mc.getProperty('version');
var res = "";
if( toheader.indexOf("/{version}") != -1 )
{
if(version == "")
var res = toheader.replace('/{version}', "");
else
var res = toheader.replace('{version}', back)
log.info(res);
}
mc.setTo(res);
</script>
Laten we per stap kijken naar wat we zojuist hebben gedaan.
Loggen in de script mediator
Er zijn verschillende voorbeelden over hoe je waarden kunt printen en loggen in de wso2carbon.log. Ik kwam erachter dat veel van deze voorbeelden niet (meer) werken. Maar, de servicelog werkt nog wel.
Maak een logobject aan met de code ‘mc.getServiceLog();’ en gebruik log.[loglevel]([value/var]) om het in de console te printen. Om een variabele in de log op loglevel ‘info’ te printen, gebruik je ‘log.info(variable)
Strings vervangen in de script mediator
Strings vervangen is lastig in de ESB. Je zou de xpath 2.0 functie kunnen inschakelen, maar dit kan bestaande integraties beïnvloeden. Met de script mediator werkt het daarentegen net zo gemakkelijk als dat het in javascript zou zijn.
In dit voorbeeld controleert het script of de (dynamisch gegenereerde) URL een {version}-element bevat. Met deze link: https://customer.yenlo.com/soapservice/{version}/testcall kan dat zo: if( toheader.indexOf("/{version}") != -1 )
Daarnaast controleer ik of de aanvrager in de versie geïnteresseerd is. (Dit is al eerder in de flow in een eigenschap gezet). Als dit niet het geval is, zal het {version}-element inclusief de voorafgaande slash verwijderd moeten worden en wordt dit het resultaat: https://customer.yenlo.com/soapservice/testcallif(version == "")
var res = toheader.replace('/{version}', "");
Als de aanvrager echter wel baat heeft bij het {versie}-nummer, dan wordt het {version}-element in de URL vervangen:
else
var res = toheader.replace('{version}', back)
De script mediator vermijden
Script mediators zijn eigenlijk een laatste uitvlucht, (afgezien van zelf een mediator schijven) en zou vermeden moeten worden als er eenvoudiger alternatieven zijn.
Er zijn maar weinig situaties waarin WSO2 ESB geen oplossing heeft. Maar in gevallen waar alleen de script mediator of een zelfgeschreven mediator uitkomst lijken te bieden, stel jezelf dan deze vragen:
- Is er geen andere oplossing mogelijk met één van de andere WSO2 ESB mediators?
- Is de ESB de juiste plek om deze functionaliteit in te bouwen?
De tweede vraag heeft te maken met de rol van de ESB. De ESB is goed in bemiddeling en transformatie, maar is bijvoorbeeld niet bedoeld voor grote transactionele verwerkingen die binnen een proxy, api of sequence gedaan worden.
Als er dan echt geen eenvoudiger alternatief overblijft en het daadwerkelijk in de ESB thuishoort, dan is de script mediator een veelzijdige oplossing.
Als je vragen hebt over deze blogpost, neem dan contact met ons op via het commentaar onder deze blog. Bekijk ook onze WSO2 Tutorials, webinars en whitepapers voor meer technische informatie. Ben je op zoek naar ondersteuning? We bieden WSO2 Productondersteuning, WSO2 Development Support, WSO2 Operational Support en WSO2 Trainingsprogramma’s.
Met dank aan Rob Blaauboer voor zijn bijdrage aan deze blog.