Egoblog.cz - Petr Kobelka

Java - paralelizace pomocí Batch procesu

Při jednom úkolu jsem měl dosáhnout lepších výsledků zpracování dat pomocí paralelizace. Principal developer navrhl použít batch proces. Jeho implementace je celkem jednoduchá a výsledek hodně efektivní.


JAVA | Komentáře (0) | Shlédnuto 1552 × | Vloženo: 14. března 2016

Momentálně znám dva zůsoby, jak paralelizovat výpočet zpracování dat v Javě. Jednou z možností je použít thread pool executor. Informace k Thread pool najdete např. na stránkách k dokumentaci Thread pool přímo na internetových stránkách firmy Oracle. Mým úkolem ale bylo použít Batch process a o této implementaci vám tu podám pár informací. Navíc přidám několik zdrojů pro zájemce, kteří se budou chtít do této problematiky ponořit hlouběji.

Nejdříve něco prostředí k vývoji

Standardně používám Netbeans (nyní ve verzi 8.1), kterým jsem přišel na chuť před několika málo lety a od kterých nemám momenálně potřebu se odkládnět k jiným nástrojům. Díky aktivnímu vývoji a spoustě doplňků je to pro mě nejlepší volba. Pro testování používám odlehčenou verzi JBoss serveru - Wildfly ve verzi 10. Více netřeba řešit :-)

Základ Batch procesu

Batch process předepisuje 3 základní třídy pro práci: ItemReader, ItemProcessor a ItemWriter. Již podle názvu jde jednoduše pochopit co má každý z prvků za úkol. Celou tuto konfiguraci je třeba umístit do konfiruačního xml /src/main/resource/META-INF.batch-jobs/<nazev-jobu>.xml. Celé to funguje velmi jednoduše. Vy jen batch procesoru řeknete, co je reader, co processor a co writer a on už sám zavolá každoou ze tříd v pořadí, v jakém je třeba. Řízení procesu necháváte na batchi a vy mu pouze dáte nástroje, které má použít pro zpracování dávky.

Zdroj obrázku: http://www.oracle.com/technetwork/articles/java/batch-1965499.html

Batch proces - ItemReader

Třída musí extendovat AbstractItemReader a implementovat rozhraní ItemReader. To vám dá základ pro minimální nutnou implementaci. Zde jsou zajímavé dvě metody a sice open() a readItem().

V případě metody open() provádím načtení celé dávky, kterou chci v rámci toho jednoho procesu zpracovat. Např. načtu 1000 zpráv z RabbitMQ. V případě metody readItem() vždy vracím pouze jednu položku z celé fronty. Batch procesor bude tuto metodu volat dokud mu nevrátíte přes return hodnotu NULL.

Batch proces - ItemProcessor

Váš procesor musí implementovat rozhraní ItemProcessor, které vám předepisuje implementaci metody processItem(). Zde se děje největší část logiky a zároveň ta nejdůležitější. Zde dochází k fyzické změně dat.

Batch proces - ItemWriter

Váš writter musí extendovat AbstractItemWriter, který mu předepíše např. metodu writeItems(). Na vstup metody je return value z procesItem() z procesoru. Já sem předávám vlastní objekt (např. ItemWriterResult, název třídy je čistě na vás), který nese výsledné informace o zpracování dat v procesoru a mohu se pak zařídit podle výsledku celého procesu.

Paralelizace Batch procesu

Pralelizaci pnastavíte jednoduše tím, že implementujete PartitionMapper. Více informací najdete např. zde, v tomto postu nebudu ParitionMapper rozebírat.

Zdroje k Java Batch processing

Podobné články jako "Java - paralelizace pomocí Batch procesu"

Petr Kobelka | Egoblog.cz | Tvorba www stránek - www.petrkobelka.cz

Petr Kobelka
Autor je zkušeným web developerem a programátorem s více než 10 letými zkušenostmi. Pracuje jako programátor pro známou Olomouckou společnost zabývající se tvorbou internetových a intranetových řešení. Spolu se zaměstnáním pracuje na volné noze a zabývá se tvorbou internetových stránek. Ve volném čase rád fotí, jezdí na kole, plave a cestuje.

Komentáře

E-mail je potřeba pouze pro vygenerování Gravataru!

Oups, žádné komentáře? Buďtě první !!!

Blog píše Petr Kobelka

Petr Kobelka - egoblog.cz

Žádám všechny, kteří mají zájem vkládat komentáře, aby se řídili pravidly NETikety. Komentáře, porušující tato pravidla můžou být bez varování smazány.