Technische uitleg streaming in het Frank!Framework

AUTEUR: NIELS MEIJER CORE DEVELOPER FRANK!FRAMEWORK

In onze vorige blog vertelden wij over onze streaming mogelijkheden in het Frank!Framework (blog.wearefrank.nl/streaming), maar hoe werkt zoiets technisch?

Streaming houdt in de basis in dat je grote objecten, bijvoorbeeld files niet in het geheel in het geheugen hoeft in te laden voordat je ze kan gaan verwerken. De bouwblokken uit het Frank!Framework krijgen een “handle” naar een input en/of outputstream op basis waarvan ze hun verwerking al kunnen starten op een deel van de data.

Laten we het in eerste instantie opknippen in twee delen, het verwerken van een binnenkomende stream inputStream en de verwerking van een uitgaande stream outputStream

 

Het gebruik van een InputStream:

Voorbeeld: Bestand uit een directory streaming verwerken.

We hebben één bestand op het FileSystem staan waarin een verzameling aan te verwerken records staan.

De Frank Adapter start en stelt een inputstream beschikbaar aan een for-each (iterator) bouwblok in de adapter. Dit bouwblok leest de stream tot het één compleet record heeft binnengekregen. Dit stukje data wordt “losgeknipt” en in een nieuw subproces verwerkt. Dit kan bijvoorbeeld een XSLT translatie zijn die vervolgens elk record wegschrijft naar een database.


Ondertussen gaat het inlezen en het opknippen in de iterator gewoon verder. Deze start voor elk record een nieuw sub proces welke in parallel worden uitgevoerd.

Waarom lezen we het bestand niet gewoon in?

De verwerking start niet na het inlezen van het volledige bestand, maar op het moment dat het eerste record gelezen is. Het verwerkingsproces start een stuk sneller! Als je het gehele bestand in geheugen leest zal dit bij grote files een flinke impact hebben op het geheugen gebruik van je applicatie. Daarnaast is het mogelijk om alle subprocessen parallel te laten lopen voor een nog grotere efficiëntie.

 

Het gebruik van een outputstream:

Streaming schrijven naar een database CLOB.

Een adapter gaat ook slim om met de beschikbare OutputStreams die hij heeft. Zo doorloopt hij eerst de gehele pipeline om te kijken of er bouwblokken tussen zitten die een OutputStream aan kunnen bieden. Tijdens het verwerken van een bericht begint de pipeline niet bij het bouwblok dat data weg wil schrijven, maar bij het bouwblok waar het weggeschreven wordt. Dit bouwblok geeft een “handle” naar een OutputStream en stelt deze beschikbaar aan de pipe(s) ervoor. Dit zorgt ervoor dat tijdens de verwerking van een bericht de data niet tijdelijk in het geheugen opgeslagen hoeft te worden, maar direct weggeschreven kan worden naar de OutputStream.

Streaming

Voor de bouwblokken in het Frank!Framework geldt vanaf versie 7.6 dat streaming de standaard is. Je kunt dit uiteraard uitzetten met behulp van een property. Als Frank Developer hoef je eigenlijk niets te veranderen aan je adapter om streaming te werken. In- en OutputStreams zijn beschikbaar voor files, databaseobjecten en uiteraard ook voor binnenkomende HTTP-requests.


Tot slot

In onze laatste release van het Frank!Framework (7.6) bieden wij standaard streaming aan. Wil je meer informatie? Neem hieronder contact op voor een adviesgesprek.

 

Benieuwd hoe WeAreFrank! een omvangrijke systeemintegratie succesvol afgerond heeft na de grootste overname in de Nederlandse verzekeringsmarkt?

waf-case-study

Juridisch was de overname in kannen en kruiken, maar op het gebied van systeemintegratie begon het avontuur toen pas. Jeroen Jansen van Rosendaal, vanuit WeAreFrank! nauw betrokken bij de systeemintegratie, neemt ons via case study mee in dit omvangrijke project.

Download case-study

Plan een gratis adviesgesprek in!