Hyrje
Si ndodhi qĂ« nĂ« vendin tim aktual tĂ« punĂ«s mĂ« duhej tĂ« njihesha me kĂ«tĂ« teknologji. Do tĂ« filloj me njĂ« histori tĂ« vogĂ«l. NĂ« njĂ« takim tĂ« fundit, ekipi ynĂ« u tha se duhet tĂ« krijojmĂ« njĂ« integrim me njĂ« sistem tĂ« njohur. NjĂ« integrim do tĂ« thoshte se ky sistem i njohur do tĂ« na dĂ«rgonte kĂ«rkesa pĂ«rmes HTTP nĂ« njĂ« pikĂ« fundore tĂ« caktuar, ndĂ«rsa ne, siç Ă«shtĂ« e çuditshme, do tĂ« dĂ«rgonim pĂ«rgjigje nĂ« formĂ«n e njĂ« mesazhi SOAP. Duket mjaft e thjeshtĂ« dhe triviale. Nga kjo rrjedh se duhet tĂ«âŠ
Detyra
KrijojmĂ« 3 shĂ«rbime. E para prej tyre Ă«shtĂ« ShĂ«rbimi i pĂ«rditĂ«simit tĂ« DB. Ky shĂ«rbim, kur merr tĂ« dhĂ«na tĂ« reja nga njĂ« sistem i jashtĂ«m, pĂ«rditĂ«son tĂ« dhĂ«nat nĂ« bazĂ«n e tĂ« dhĂ«nave dhe gjeneron njĂ« skedar nĂ« formatin CSV, pĂ«r ta transferuar atĂ« nĂ« sistemin tjetĂ«r. Aktivizohet pika fundore e shĂ«rbimit tĂ« dytĂ« â ShĂ«rbimi i transportit pĂ«rmes FTP, i cili merr skedarin e dĂ«rguar, e validon atĂ« dhe e ruan nĂ« hapĂ«sirĂ«n e skedarĂ«ve pĂ«rmes FTP. ShĂ«rbimi i tretĂ« â ShĂ«rbimi i transferimit tĂ« tĂ« dhĂ«nave pĂ«r konsumatorin, punon asinkronisht me dy shĂ«rbimet e para. Ai pranon njĂ« kĂ«rkesĂ« nga njĂ« sistem i jashtĂ«m pĂ«r tĂ« marrĂ« skedarin pĂ«r tĂ« cilin u fol mĂ« lart, merr skedarin e gatshĂ«m tĂ« pĂ«rgjigjjes, e modifikon atĂ« (pĂ«rditĂ«son fushat id, description, linkToFile) dhe dĂ«rgon pĂ«rgjigjen nĂ« formĂ«n e njĂ« mesazhi SOAP. Pra, nĂ« pĂ«rgjithĂ«si, pamja Ă«shtĂ« kĂ«shtu: dy shĂ«rbimet e para fillojnĂ« punĂ«n e tyre vetĂ«m kur vijnĂ« tĂ« dhĂ«na pĂ«r pĂ«rditĂ«sim. ShĂ«rbimi i tretĂ« punon vazhdimisht pasi konsumatorĂ«t e informacionit janĂ« shumĂ«, rreth 1000 kĂ«rkesa pĂ«r tĂ« dhĂ«na nĂ« minutĂ«. ShĂ«rbimet janĂ« gjithmonĂ« tĂ« disponueshme dhe instancat e tyre ndodhen nĂ« mjedise tĂ« ndryshme, si testi, demo, para-prodhimi dhe prodhimi. MĂ« poshtĂ« paraqitet skema e funksionimit tĂ« kĂ«tyre shĂ«rbimeve. MenjĂ«herĂ« do tĂ« sqaroj se disa detaje janĂ« thjeshtuar pĂ«r tĂ« shmangur kompleksitetin e tepĂ«rt.

Thellimi teknik
Kur planifikimin e zgjidhjes së detyrës, së pari u vendos të krijohen aplikacione në java duke përdorur Spring framework, me balancuesin Nginx, bazën e të dhënave Postgres dhe disa teknologji të tjera. Për shkak se koha për zhvillimin e zgjidhjes teknike lejonte shqyrtimin e qasjeve të tjera për zgjidhjen e kësaj detyre, u fokusua në teknologjinë e njohur në disa rrethe, Apache NIFI. Të them të drejtën, kjo teknologji na ndihmoi të vërejmë këto 3 shërbime. Në këtë artikull do të përshkruhet zhvillimi i shërbimit të transportit të skedarëve dhe shërbimit të transferimit të të dhënave te konsumatori, megjithatë, nëse artikulli do të pranohet, do të shkruaj mbi shërbimin e përditësimit të të dhënave në bazën e të dhënave.
ĂfarĂ« Ă«shtĂ« kjo
NIFI pĂ«rfaqĂ«son njĂ« arkitekturĂ« tĂ« shpĂ«rndarĂ« pĂ«r ngarkimin dhe pĂ«rpunimin e shpejtĂ« tĂ« tĂ« dhĂ«nave nĂ« paralel, njĂ« numĂ«r tĂ« madh plugins pĂ«r burimet dhe transformimet, versionimin e konfigurimeve dhe shumĂ« mĂ« tepĂ«r. NjĂ« bonus tĂ« kĂ«ndshĂ«m Ă«shtĂ« se Ă«shtĂ« shumĂ« i thjeshtĂ« pĂ«r t'u pĂ«rdorur. Proceset triviale, si getFile, sendHttpRequest dhe tĂ« tjera â mund tĂ« paraqiten si katrorĂ«. Ădo katror pĂ«rfaqĂ«son njĂ« proces, ndĂ«rveprimi i tĂ« cilit mund tĂ« shihet nĂ« ilustrimin mĂ« poshtĂ«. Dokumentacioni mĂ« i hollĂ«sishĂ«m mbi ndĂ«rveprimin dhe konfigurimin e proceseve Ă«shtĂ« shkruar , pĂ«r ata qĂ« flasin rusisht â . NĂ« dokumentacion Ă«shtĂ« pĂ«rshkruar shkĂ«lqyeshĂ«m si tĂ« shkarkoni dhe filloni NIFI, si dhe si tĂ« krijoni procese, ato janĂ« katrorĂ«t
Ideja për të shkruar këtë artikull lindi pas një kërkimi të gjatë dhe strukturimit të informacionit të marrë në diçka të kuptueshme, si dhe dëshira për të lehtësuar pak jetën e zhvilluesve të ardhshëm.
Shembulli
KĂ«tu shqyrtohet njĂ« shembull se si ndodhin ndĂ«rveprimet mes katrorĂ«ve. Skema e pĂ«rgjithshme Ă«shtĂ« mjaft e thjeshtĂ«: Marrim njĂ« kĂ«rkesĂ« HTTP (Teoretikisht me njĂ« skedar nĂ« trup tĂ« kĂ«rkesĂ«s. PĂ«r tĂ« demonstruar mundĂ«sitĂ« e NIFI, nĂ« kĂ«tĂ« shembull, kĂ«rkesa fillon procesin e marrjes sĂ« skedarit nga depoja lokale), pastaj dĂ«rgojmĂ« njĂ« pĂ«rgjigje qĂ« tregon se kĂ«rkesa Ă«shtĂ« marrĂ«, paralelisht nis procesi i marrjes sĂ« skedarit nga depoja dhe mĂ« pas procesi i transferimit tĂ« tij pĂ«rmes FTP nĂ« depo. ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se proceset ndĂ«rveprojnĂ« me njĂ«ri-tjetrin pĂ«rmes asaj qĂ« quhet flowFile. Kjo Ă«shtĂ« njĂ« entitet bazik nĂ« NIFI qĂ« ruan atributet dhe pĂ«rmbajtjen. PĂ«rmbajtja â tĂ« dhĂ«nat qĂ« pĂ«rfaqĂ«sohen nga skedari i rrjedhĂ«s. Pra, nĂ« mĂ«nyrĂ« bruto, nĂ«se merrni njĂ« skedar nga njĂ« katror dhe e dĂ«rgoni atĂ« nĂ« njĂ« tjetĂ«r, pĂ«rmbajtja do tĂ« jetĂ« skedari juaj.

Siç mund ta vini re â nĂ« kĂ«tĂ« ilustrim Ă«shtĂ« pĂ«rshkruar procesi i pĂ«rgjithshĂ«m. HandleHttpRequest â merr kĂ«rkesat, ReplaceText â gjeneron trupin e pĂ«rgjigjes, HandleHttpResponse â jep pĂ«rgjigjen. FetchFile â merr skedarin nga depoja e skedarĂ«ve dhe e dĂ«rgon nĂ« katrorin PutSftp â e vendos kĂ«tĂ« skedar nĂ« FTP, nĂ« adresĂ«n e specifikuar. Tani mĂ« shumĂ« rreth kĂ«tij procesi.
NĂ« kĂ«tĂ« rast â kĂ«rkesa Ă«shtĂ« fillimi i gjithçkaje. Le tĂ« shohim parametrat e saj tĂ« konfigurimit.

KĂ«tu gjithçka Ă«shtĂ« mjaft triviale pĂ«rveç StandartHttpContextMap â ky Ă«shtĂ« njĂ« shĂ«rbim qĂ« lejon dĂ«rgimin dhe marrjen e kĂ«rkesave. MĂ« hollĂ«sisht dhe madje me shembuj mund tĂ« shikoni â
Tani le tĂ« shqyrtojmĂ« parametrat e konfigurimit tĂ« katrorit ReplaceText. TĂ«rĂ« rĂ«ndĂ«si ka ReplacementValue â kjo Ă«shtĂ« ajo qĂ« do t'i kthehet pĂ«rdoruesit si pĂ«rgjigje. NĂ« settings mund tĂ« rregullohet niveli i regjistrimit, log-et mund tĂ« shihen {ku u desh nifi}\/nifi-1.9.2\/logs atje gjithashtu ka parametrat failure\/success â duke u bazuar nĂ« kĂ«to parametra mund tĂ« rregullohet procesi nĂ« tĂ«rĂ«si. Pra, nĂ« rast tĂ« njĂ« pĂ«rpunimi tĂ« suksesshĂ«m tĂ« tekstit â do tĂ« niset procesi i dĂ«rgimit tĂ« pĂ«rgjigjes pĂ«r pĂ«rdoruesin, ndĂ«rsa nĂ« rastin tjetĂ«r thjesht regjistrojmĂ« njĂ« proces tĂ« dĂ«shtuar.

Në pronat e HandleHttpResponse nuk ka asgjë shumë interesante përveç statusit në rast të krijimit të suksesshëm të përgjigjes.

Me kĂ«rkesat dhe pĂ«rgjigjet u shuguruam â le tĂ« kalojmĂ« nĂ« marrjen e skedarit dhe vendosjen e tij nĂ« serverin FTP. FetchFile â merr skedarin sipas rrugĂ«s e cila Ă«shtĂ« caktuar nĂ« konfigurim dhe e dĂ«rgon atĂ« nĂ« procesin e ardhshĂ«m.

Më pas, kati PutSftp vendos skedarin në storien e skedarëve. Parametrat e konfigurimit mund t'i shohim më poshtë.

ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se secili kat Ă«shtĂ« njĂ« proces i veçantĂ« qĂ« duhet tĂ« aktivizohet. Ne shqyrtuam shembullin mĂ« tĂ« thjeshtĂ« qĂ« nuk kĂ«rkon ndonjĂ« personalizim tĂ« komplikuar. Tani do tĂ« shqyrtojmĂ« njĂ« proces pak mĂ« tĂ« komplikuar, ku do tĂ« shkruajmĂ« pak mĂ« shumĂ« nĂ« Groovy.
Shembulli më i komplikuar
Shërbimi i transferimit të të dhënave për konsumatorin rezultoi pak më i komplikuar për shkak të procesit të modifikimit të mesazhit SOAP. Procesi i përgjithshëm paraqitet në figurën më poshtë.

Këtu ideja nuk është shumë e komplikuar: morëm një kërkesë nga konsumatori se iu nevojiten të dhëna, dërguam një përgjigje se morëm mesazhin, aktivizuam procesin për marrjen e skedarit të përgjigjes, më pas e redaktuam me një logjikë specifike, pas së cilës e kaluam skedarin te konsumatori në formën e një mesazhi SOAP në server.
Mendoj se nuk ka nevojĂ« tĂ« pĂ«rshkruaj pĂ«rsĂ«ri katet qĂ« pamĂ« mĂ« sipĂ«r â do tĂ« kalojmĂ« menjĂ«herĂ« te tĂ« rejat. NĂ«se ju nevojitet tĂ« redaktoni ndonjĂ« skedar dhe katet e zakonshme si ReplaceText nuk i pĂ«rmbushin kĂ«rkesat, do t'ju duhet tĂ« shkruani skriptin tuaj. Kjo mund tĂ« bĂ«het duke pĂ«rdorur katin ExecuteGroovyScript. CilĂ«simet e tij janĂ« paraqitur mĂ« poshtĂ«.

Ka janĂ« dy mundĂ«si pĂ«r tĂ« ngarkuar skiptin nĂ« kĂ«tĂ« katror. E para Ă«shtĂ« pĂ«rmes ngarkimit tĂ« njĂ« skedari me skiptin. E dyta Ă«shtĂ« duke futur skiptin nĂ« scriptBody. Sa di unĂ«, katrori executeScript mbĂ«shtet disa gjuhĂ« programimi - njĂ« prej tyre Ă«shtĂ« groovy. Do tĂ« zhgĂ«njej zhvilluesit e java-s - nuk Ă«shtĂ« e mundur tĂ« shkruhen skipte nĂ« kĂ«to katrorĂ«. PĂ«r ata qĂ« kanĂ« dĂ«shirĂ« tĂ« madhe - duhet tĂ« krijoni njĂ« katror tĂ« personalizuar dhe ta futni nĂ« sistemin NIFI. E gjithĂ« kjo operacion shoqĂ«rohet me njĂ« sĂ«rĂ« tĂ« gjatĂ« gjeste, tĂ« cilat nuk do t'i trajtojmĂ« brenda kĂ«tij artikulli. UnĂ« zgjodha gjuhĂ«n groovy. MĂ« poshtĂ« Ă«shtĂ« njĂ« skipt testues qĂ« thjesht pĂ«rditĂ«son nĂ« mĂ«nyrĂ« inkrementale id-nĂ« nĂ« mesazhin SOAP. ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet. Merrni skedarin nga flowFile, e pĂ«rditĂ«soni atĂ«, mos harroni ta ktheoni, tĂ« pĂ«rditĂ«suar, pĂ«rsĂ«ri aty. Gjithashtu, Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« theksohet qĂ« jo tĂ« gjitha bibliotekat janĂ« tĂ« lidhura. Mund tĂ« ndodhĂ« qĂ« ju pĂ«rsĂ«ri do tĂ« duhet tĂ« importoni njĂ« nga libraritĂ«. NjĂ« tjetĂ«r disavantazh Ă«shtĂ« se skiptin nĂ« kĂ«tĂ« katror Ă«shtĂ« mjaft e vĂ«shtirĂ« ta debagoni. Ekziston njĂ« mĂ«nyrĂ« pĂ«r t'u lidhur me JVM NIFI dhe pĂ«r tĂ« filluar procesin e debagimit. Personalisht, kam nisur njĂ« aplikacion lokal dhe kam simuluar marrjen e skedarit nga sesioni. Edhe pĂ«r debagimin kam punuar lokalish. Gabimet qĂ« dalin gjatĂ« ngarkimit tĂ« skiptit janĂ« mjaft tĂ« lehta pĂ«r t'u gjetur nĂ« Google dhe shkruhen nga vetĂ« NIFI nĂ« log.
import org.apache.commons.io.IOUtils
import groovy.xml.XmlUtil
import java.nio.charset.*
import groovy.xml.StreamingMarkupBuilder
def flowFile = session.get()
if (!flowFile) return
try {
flowFile = session.write(flowFile, { inputStream, outputStream ->
String result = IOUtils.toString(inputStream, "UTF-8");
def recordIn = new XmlSlurper().parseText(result)
def element = recordIn.depthFirst().find {
it.name() == 'id'
}
def newId = Integer.parseInt(element.toString()) + 1
def recordOut = new XmlSlurper().parseText(result)
recordOut.Body.ClientMessage.RequestMessage.RequestContent.content.MessagePrimaryContent.ResponseBody.id = newId
def res = new StreamingMarkupBuilder().bind { mkp.yield recordOut }.toString()
outputStream.write(res.getBytes(StandardCharsets.UTF_8))
} as StreamCallback)
session.transfer(flowFile, REL_SUCCESS)
}
catch(Exception e) {
log.error("Gabim gjatë procesimit të validate.groovy", e)
session.transfer(flowFile, REL_FAILURE)
}Në të vërtetë, këtu përfundon personalizimi i katrorit. Më pas, skedari i përditësuar kalon në katrorin që merret me dërgimin e skedarit në server. Më poshtë janë cilësimet e këtij katrori.

Përshkruajmë metodën me të cilën do të dërgohet mesazhi SOAP. Shkruajmë se ku. Më pas duhet të tregojmë se është saktësisht SOAP.

Shtojmë disa pronësi si host dhe veprimi (soapAction). Ruajmë, kontrollojmë. Më shumë informacion se si të dërgoni kërkesa SOAP mund të shihni.
Kemi shqyrtuar disa mundĂ«si pĂ«r pĂ«rdorimin e proceseve NIFI. Si ndĂ«rveprojnĂ« ato dhe çfarĂ« pĂ«rfitimi real pĂ«rfitojmĂ«. Shembujt e shqyrtuar janĂ« testues dhe pak ndryshojnĂ« nga ajo qĂ« Ă«shtĂ« realisht nĂ« prodhim. Shpresoj se ky artikull do tĂ« jetĂ« disi i dobishĂ«m pĂ«r zhvilluesit. Faleminderit pĂ«r vĂ«mendjen. NĂ«se keni ndonjĂ« pyetje â shkruani. Do tĂ« pĂ«rpiqem tĂ« pĂ«rgjigjem.
Burimi: habr.com
