fb
Enterprise Integration 7 min

Werken met taken in de Enterprise Integrator 6.6.0

Rob Blaauboer
Rob Blaauboer
Integration Consultant & WSO2 Trainer
enterprise integrator
Scroll

WSO2 Enterprise Integrator heeft een taakimplementatie waarmee je repetitieve of reguliere CRON-gebaseerde taken kunt plannen. Maar hoe werkt dit? En dan vooral met CRON, want voor velen zijn deze combinaties van vraagtekens en streepjes wat intimiderend en moeilijk te begrijpen.

Als onderdeel van deze oefening heb ik een heel eenvoudige sequence gemaakt die we kunnen gebruiken met een aantal als voorbeeld dienende taakconfiguraties. Zo kan ik je de veelzijdigheid aan taken in Enterprise Integrator 6.6.0 laten zien.

Aangepaste taakimplementaties

Integrator biedt een mechanisme om je eigen aangepaste taakimplementaties te introduceren. Dat betekent dat je de taakimplementatie van de WSO2 Enterprise Integrator uitbreidt met een aangepast Java-programma. Dit geeft je nog meer flexibiliteit buiten het domein van sequences en proxy-gebaseerde taken.

Denk bijvoorbeeld aan hoe we in Nederland op elke eerste maandag van de maand om 12 uur ’s middags de sirenes van het luchtalarm testen dat wordt gebruikt in geval van nood.

Dat zou mogelijk zijn met een aangepaste Java-extensie waarmee je kunt definiëren wat er in dit geval moet gebeuren, namelijk het verzenden van signalen naar andere systemen. Aangezien dit echter een zeer specifiek gebruiksscenario is, gaan we hier niet dieper op in.

Repetitieve taken

Laten we beginnen met de twee mogelijkheden die we hebben met betrekking tot het plannen van taken. De eerste is de eenvoudigste: een repetitieve taak met een interval. Een dergelijke taak zal een actie eenvoudigweg het aantal door jou opgegeven keren uitvoeren, met het interval dat je ook kunt definiëren in seconden.

Je kunt deze taak als volgt instellen in Integration Studio;

sheduled task artifect

Eenmaal ingesteld, ziet de taak er zoals onderstaand uit;

sheduled task

Dus als je een bericht naar een systeem wilt sturen of een routine-query wilt uitvoeren, kun je dit doen door simpelweg het aantal iteraties en het interval op te geven. Er is echter één uitzondering. Als je een taak plant om deze slechts eenmalig uit te voeren, betekent dit dat de taak daadwerkelijk wordt uitgevoerd bij het opstarten. Dus een geplande taak met het aantal één wordt alleen uitgevoerd bij het opstarten/herstarten van het systeem.

DadJokeAPI

Laten we eens kijken hoe dat werkt voor de sequence. Ik gebruik een hele leuke API. Eentje die je een zogenaamde dad joke geeft. Deze dad jokes zijn soms erg grappig en op geen enkele manier aanstootgevend. Het zijn voornamelijk woordspelingen. Ik heb de DadJokeSequence gemaakt om de API aan te roepen. De grap is opgenomen in het veld met de naam joke, in de binnenkomende JSON-responspayload.

De sequence is als volgt:

sequence

En de broncode:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="DadJokeSequence" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <header name="Accept" scope="transport" value="application/json"/>
    <call>
        <endpoint>
            <http method="get" uri-template="https://icanhazdadjoke.com/">
                <suspendOnFailure>
                    <initialDuration>-1</initialDuration>
                    <progressionFactor>-1</progressionFactor>
                    <maximumDuration>0</maximumDuration>
                </suspendOnFailure>
                <markForSuspension>
                    <retriesBeforeSuspension>0</retriesBeforeSuspension>
                </markForSuspension>
            </http>
        </endpoint>
    </call>
    <log level="custom">
        <property expression="json-eval($.joke)" name="Today's Super Funny Dad Joke brought to you by Yenlo"/>
    </log>
</sequence>

Laten we deze dus gebruiken. En zien of we vijf van deze dad jokes met een interval van vijf seconden op onze console kunnen krijgen.

[2021-09-27 13:30:44,070] INFO {org.apache.synapse.mediators.builtin.LogMediator} - Today's Super Funny Dad Joke brought to you by Yenlo = Why was Pavlov's beard so soft? Because he conditioned it.
[2021-09-27 13:30:49,032] INFO {org.apache.synapse.mediators.builtin.LogMediator} - Today's Super Funny Dad Joke brought to you by Yenlo = Ever wondered why bees hum? It's because they don't know the words.
[2021-09-27 13:30:54,037] INFO {org.apache.synapse.mediators.builtin.LogMediator} - Today's Super Funny Dad Joke brought to you by Yenlo = Every machine in the coin factory broke down all of a sudden without explanation. It just doesn’t make any cents.
[2021-09-27 13:30:59,032] INFO {org.apache.synapse.mediators.builtin.LogMediator} - Today's Super Funny Dad Joke brought to you by Yenlo = Cosmetic surgery used to be such a taboo subject.
Now you can talk about Botox and nobody raises an eyebrow.
[2021-09-27 13:31:04,032] INFO {org.apache.synapse.mediators.builtin.LogMediator} - Today's Super Funny Dad Joke brought to you by Yenlo = Chances are if you' ve seen one shopping center, you've seen a mall.

Zoals je kunt zien, was dat niet zo moeilijk. Het volgende voorbeeld heb ik zo ingesteld dat de taak één keer wordt gepland bij het opstarten.

trigger informatiion

En zoals je kunt zien, wordt met de onderstaande fragmenten die bij het opstarten van de console zijn gekopieerd de dad joke weergegeven. Je kunt een dergelijke taak ook handmatig plannen. Je kunt de taakimplementatie openen met je beheer-UI en deze handmatig plannen. Het vreemde is dat deze interval 0 toont in Integration Studio, maar 1 in Beheer-UI.

triggertask
[2021-09-27 13:43:56,114]  INFO {org.apache.synapse.mediators.builtin.LogMediator} - Today's Super Funny Dad Joke brought to you by Yenlo = Why did the cookie cry?
Because his mother was a wafer so long

CRON

Implementatie van EI Schedule Task is gebaseerd op Quartz Scheduler. Een cron-expressie in Quartz is een reeks die bestaat uit zes of zeven velden, gescheiden door witruimte. Er staat een leuke tutorial online.

triggertype

Deze taak wordt elke twee minuten van elk uur van de dag en het jaar uitgevoerd.

[2021-09-27 14:44:00,248]  INFO {org.apache.synapse.mediators.builtin.LogMediator} - Today's Super Funny Dad Joke brought to you by Yenlo = I gave all my dead batteries away today, free of charge.
[2021-09-27 14:46:00,177]  INFO {org.apache.synapse.mediators.builtin.LogMediator} - Today's Super Funny Dad Joke brought to you by Yenlo = What is a centipedes's favorite Beatle song?  I want to hold your hand, hand, hand, hand...

Elk veld kan elk van de toegestane waarden bevatten, samen met verschillende combinaties van de toegestane speciale tekens voor dat veld. De velden zijn als volgt:

Field NameMandatoryAllowed ValuesAllowed Special Characters
SecondsYES0-59, – * /
MinutesYES0-59, – * /
HoursYES0-23, – * /
Day of monthYES1-31, – * ? / L W
MonthYES1-12 of JAN-DEC, – * /
Day of weekYES1-7 of SUN-SAT, – * ? / L #
YEARNOleeg, 1970-2099, – * /

Wat kunnen we doen met deze speciale tekens? Volgens de documentatie het volgende:

  • ( “all values” ): wordt gebruikt om alle waarden in een veld te selecteren.
  • “?” (“no specific value”): handig wanneer je iets moet specificeren in een van de twee velden waarin het teken is toegestaan, maar niet in het andere.
  • “-“: wordt gebruikt om bereik op te geven.
  • “,”: wordt gebruikt om aanvullende waarden op te geven.
  • /: wordt gebruikt om incrementen op te geven.
  • L (“last”): heeft een verschillende betekenis in elk van de twee velden waarin het is toegestaan. De waarde ‘L’ in het veld ‘day of month’ betekent bijvoorbeeld ‘de laatste dag van de maand’; dag 31 voor januari, dag 28 voor februari als het geen schrikkeljaar is.
  • W (“weekday”): wordt gebruikt om de weekdag (maandag-vrijdag) aan te geven die het dichtst bij de opgegeven dag ligt.
  • De tekens ‘L’ en ‘W’ kunnen ook worden gecombineerd in het veld ‘day of month’ om ‘LW’ te genereren, wat zich vertaalt in *’laatste weekdag van de maand’*.
  • #: wordt gebruikt om ‘de ne’ XXXdag van de maand op te geven. De waarde van “6#3” in het veld ‘day of week’ betekent bijvoorbeeld ‘de derde vrijdag van de maand’ (dag 6 = vrijdag en “#3” = de derde van de maand).

Zoals je kunt zien (en ik heb dit bovenstaande stuk ingekort) zijn er hele leuke combinaties die uitgeprobeerd kunnen worden. Doet een beetje denken aan het idee achter RegEx. In sommige gevallen kun je hetzelfde resultaat bereiken met verschillende combinaties.

Een paar voorbeelden

In dit voorbeeld worden taken voor elke minuut gepland.

Afbeelding1

Terwijl in dit voorbeeld elke 10 seconden wordt gepland

Afbeelding2

En in dit voorbeeld tussen de 10e en 12e minuut van het uur. Tot aan 12:50.

Afbeelding3

Tot slot: elke 10 seconden tussen de 33e en 35e minuut van het uur 14:00 en het uur 15:00 (14-15) in september (de negende maand) van elk jaar.

Afbeelding4

Lastige dingen

Werken met Quartz Cron-statements kan nogal lastig zijn. Het kostte me wat tijd om sommige configuraties te achterhalen en ik heb me niet eens aan de complexe combinaties gewaagd. Er zijn veel mogelijkheden, maar ze zijn niet allemaal even gemakkelijk te begrijpen. Door de configuraties zelf te proberen en gebruiken, wordt duidelijk welk scenario werkt en welk niet (er verschijnt een foutmelding op de console).

Ik hoop dat ik wat meer inzicht heb kunnen geven in de Quartz-implementatie in WSO2 Enterprise Integrator 6.6.0.

Wil je meer weten over WSO2 Enterprise Integrator? Kijk dan eens naar een van onze trainingen.