Reaktivno programiranje java. Reaktivno programiranje u Objective-C

Želim da vam pričam o modernoj programskoj disciplini koja ispunjava rastuće zahtjeve za skalabilnost, toleranciju grešaka i brzu reakciju, te je neophodna kako u okruženjima s više jezgara tako iu cloud computing, kao i predstaviti otvoreni online kurs o njemu, koji će početi za samo nekoliko dana.

Ako niste čuli za reaktivno programiranje, Sve je uredu. Ovo je disciplina koja se brzo razvija i kombinuje konkurentnost sa događajima vođenom i asinkronom. Reaktivnost je svojstvena svakom web servisu i distribuiranom sistemu i predstavlja jezgro mnogih sistema visokih performansi sa visokim stepenom paralelizma. Ukratko, autori kursa predlažu da se reaktivno programiranje razmotri kao prirodno proširenje funkcionalnog programiranja (sa funkcijama višeg reda) na paralelne sisteme sa distribuiranim stanjem, koordinirano i orkestrirano asinhronim tokovima podataka koje razmjenjuju aktivni subjekti, ili glumci.

Razumljivijim riječima, to je opisano u Reaktivnom manifestu, u nastavku ću prepričati glavne odredbe iz njega, a cijeli prijevod je objavljen na Habréu. Kao što Wikipedia kaže, termin reaktivno programiranje postoji već dugo vremena i praktične primjene različitog stepena egzotike, ali je nedavno dobio novi podsticaj za razvoj i distribuciju, zahvaljujući naporima autora Reactive Manifesta, inicijativne grupe Typesafe Inc. Typesafe je poznat u zajednici funkcionalnog programiranja kao kompanija koju su osnovali autori odličnog Scala jezika i revolucionarne paralelne platforme Akka. Sada svoju kompaniju pozicioniraju kao kreatora prve svjetske mlazne platforme dizajnirane za razvoj nove generacije. Njihova platforma vam omogućava da brzo razvijete kompleks korisnička sučelja i pruža novi nivo apstrakcije preko paralelnog računarstva i višenitnog rada, smanjujući njihove inherentne rizike kroz garantovano predvidljivo skaliranje. On provodi u praksi ideje Reactive Manifesta i omogućava programeru da shvati i kreira aplikacije koje zadovoljavaju današnje potrebe.

Ovu platformu i reaktivno programiranje možete upoznati tako što ćete učestvovati u Reactive Principles Massive Open Online Course. Ovaj kurs je nastavak kursa Martina Oderskyja "Principi funkcionalnog programiranja u Scali", koji je imao preko 100.000 polaznika i koji je pokazao jednu od najvećih stopa uspjeha za Massive Open Online Course od strane njegovih učesnika u svijetu. Zajedno sa tvorcem jezika Scala, novi kurs predaju Eric Meyer, koji je razvio Rx okvir za reaktivno programiranje pod .NET-om, i Roland Kuhn, koji trenutno vodi razvojni tim Akka u Typesafe-u. Kurs pokriva ključne elemente reaktivnog programiranja i pokazuje kako se oni primjenjuju na dizajniranje sistema vođenih događajima koji su skalabilni i tolerantni na greške. Nastavni materijal je ilustrovan kratki programi i praćen je skupom zadataka, od kojih je svaki softverski projekat. U slučaju uspješnog izvršenja svih zadataka, učesnici dobijaju sertifikate (naravno, učešće i sertifikati su besplatni). Kurs traje 7 sedmica i počinje ovog ponedjeljka, 4. novembra. Detaljan pregled kao i uvodni video dostupni su na stranici kursa: https://www.coursera.org/course/reactive.

Za one koji su zainteresirani ili sumnjaju, nudim sažeti sažetak osnovnih koncepata Reaktivnog manifesta. Njegovi autori primjećuju značajne promjene u zahtjevima za prijave za poslednjih godina. Danas se aplikacije postavljaju u bilo koje okruženje iz mobilnih uređaja na klastere oblaka sa hiljadama višejezgrenih procesora. Ova okruženja postavljaju nove zahtjeve softver i tehnologije. Arhitektura prethodne generacije bila je fokusirana na upravljane servere i kontejnere, skaliranje kroz dodatni skupi hardver, vlasnička rješenja i paralelno računanje kroz multithreading. Trenutno se razvija nova arhitektura koja ima četiri ključne karakteristike koje su sve više zastupljene u potrošačkim i korporativnim industrijskim okruženjima. Sistemi sa ovom arhitekturom su: vođeni događajima, skalabilni, otporni na greške (otporni) i imaju brz odgovor, tj. responsive (Reagirajuće). Ovo pruža besprekorno korisničko iskustvo u realnom vremenu podržano samoizlečivim, skalabilnim stekom aplikacija koji je spreman za primenu u višejezgrenim i cloud okruženjima. Svaka od četiri karakteristike reaktivne arhitekture primjenjuje se na cijeli tehnološki stog, što ih razlikuje od veza u slojevitim arhitekturama. Razmotrimo ih malo detaljnije.


Event Driven aplikacije pretpostavljaju asinkronu komponentnu komunikaciju i implementiraju njihov labavo povezan dizajn: pošiljalac i primatelj poruke ne moraju znati ni jedan o drugom ni o metodi prijenosa poruke, što im omogućava da se koncentrišu na sadržaj komunikacije. Pored činjenice da labavo povezane komponente značajno poboljšavaju održivost, proširivost i evoluciju sistema, asinhronost i neblokirajuća priroda njihove interakcije takođe može osloboditi značajan deo resursa, smanjiti vreme odziva i obezbediti O više propusnost u poređenju sa tradicionalnim aplikacijama. Zahvaljujući prirodi vođenoj događajima, moguće su ostale karakteristike reaktivne arhitekture.

Skalabilnost u kontekstu reaktivnog programiranja, to je reakcija sistema na promjenu opterećenja, tj. elastičnost, postignuta mogućnošću dodavanja ili oslobađanja računarskih čvorova po potrebi. Uz nisku povezanost, asinkronu razmjenu poruka i transparentnost lokacije, metoda implementacije i topologija aplikacije postaju odluka o vremenu implementacije i podliježu konfiguraciji koja reaguje na opterećenje i adaptivnim algoritmima. dakle, računarsku mrežu postaje dio aplikacije, u početku ima eksplicitnu distribuiranu prirodu.

tolerancije grešaka reaktivna arhitektura također postaje dio dizajna, što je čini značajno drugačijom od tradicionalnih pristupa osiguravanju kontinuirane dostupnosti sistema kroz redundantnost servera i prelazak na grešku. Otpornost takvog sistema postiže se njegovom sposobnošću da ispravno reaguje na kvarove pojedinih komponenti, izoluje ove kvarove pohranjivanjem njihovog konteksta u obliku poruka koje su ih uzrokovale i prosljeđuje ove poruke drugoj komponenti koja može donijeti odluke o tome kako riješite grešku. Ovaj pristup vam omogućava da održite poslovnu logiku aplikacije čistom, odvajajući logiku rukovanja greškama od nje, koja je formulisana u eksplicitnom deklarativnom obliku za registrovanje, izolovanje i rukovanje greškama pomoću samog sistema. Za izgradnju takvih sistema samoizlječenja, komponente su poređane hijerarhijski, a problem se eskalira do nivoa koji ga može riješiti.

I na kraju responzivnost- to je sposobnost sistema da odgovori na unos korisnika bez obzira na opterećenje i kvarove, takve aplikacije uključuju korisnika u interakciju, stvaraju osjećaj zatvoriti vezu sa sistemom i dovoljnom opremom za obavljanje tekućih zadataka. Reakcija je relevantna ne samo u sistemima u realnom vremenu, već je neophodna i za širok spektar aplikacija. Štaviše, sistem koji nije u stanju da brzo reaguje čak ni u trenutku kvara ne može se smatrati otpornim na greške. Responzivnost se postiže korištenjem modela koji se mogu promatrati, tokova događaja i klijenata sa stanjem. Opservabilni modeli emituju događaje kada se njihovo stanje promeni i obezbeđuju interakciju u realnom vremenu između korisnika i sistema, dok tokovi događaja obezbeđuju apstrakciju na kojoj se ova interakcija gradi kroz neblokirajuće asinhrone transformacije i komunikacije.

Dakle, reaktivne aplikacije predstavljaju uravnotežen pristup rješavanju širokog spektra problema savremenog razvoja softvera. Izgrađeni na temeljima vođenim događajima, oni pružaju alate potrebne da garantuju skalabilnost i toleranciju grešaka, i podržavaju potpuno funkcionalno korisničko iskustvo. Autori to očekuju sve više sistemi će se pridržavati principa reaktivnog manifesta.

Osim toga, dajem plan kursa bez prijevoda. Za slučaj da ste pročitali ovo daleko i da ste još uvijek radoznali.

1. sedmica: Pregled principa funkcionalnog programiranja: supstitucijski model, for-izrazi i kako se oni odnose na monade. Uvodi novu implementaciju for-izraza: generatore slučajnih vrijednosti. Pokazuje kako se ovo može koristiti u randomiziranom testiranju i daje pregled ScalaCheck-a, alata koji implementira ovu ideju.

2. sedmica: Funkcionalno programiranje i promjenjivo stanje. Šta čini objekat promjenjivim? Kako to utiče na model zamjene. Prošireni primjer: simulacija digitalnog kola

3. sedmica: futures. Uvodi budućnost kao drugu monadu, sa for-izrazima kao konkretnom sintaksom. Pokazuje kako se budućnosti mogu sastaviti kako bi se izbjeglo blokiranje niti. Raspravlja o rukovanju greškama u više niti.

4. sedmica: Reaktivna obrada toka. Generaliziranje budućnosti na reaktivne proračune preko tokova. stream operatori.

5. sedmica:Glumci. Uvodi model aktera, aktere kao inkapsulirane jedinice konzistentnosti, asinhrono prosljeđivanje poruka, raspravlja o različitoj semantici isporuke poruke (najviše jednom, barem jednom, točno jednom) i eventualnoj konzistentnosti.

6. sedmica: nadzor. Uvodi reifikaciju kvara, hijerarhijsko rukovanje greškama, uzorak kernela greške, praćenje životnog ciklusa, raspravlja o prolaznom i trajnom stanju.

sedmica 7: Obrasci razgovora. Raspravlja o upravljanju stanjem razgovora između aktera i obrascima za kontrolu toka, usmjeravanju poruka u grupe aktera radi otpornosti ili balansiranja opterećenja, potvrde prijema kako bi se postigla pouzdana isporuka.

Svijet razvoja OOP-a općenito i Java jezika posebno žive vrlo aktivnim životom. Ima svoje modne trendove, a danas ćemo analizirati jedan od glavnih trendova sezone - ReactiveX framework. Ako ste još podalje od ovog talasa - obećavam da će vam se svideti! Definitivno je bolja od farmerki visokog struka :).

Reaktivno programiranje

Čim su OOP jezici sazreli za masovnu upotrebu, programeri su shvatili koliko mogućnosti jezika sličnih C ponekad nedostaju. Pošto pisanje koda u stilu funkcionalnog programiranja ozbiljno narušava kvalitet OOP koda, a samim tim i održivost projekta, izmišljen je hibrid - reaktivno programiranje.

Paradigma reaktivnog razvoja temelji se na ideji stalnog praćenja promjena u stanju objekta. Ako je došlo do takvih promjena, tada bi svi zainteresirani objekti trebali dobiti već ažurirane podatke i raditi samo s njima, zaboravljajući na stare.

Dobar primjer ideje reaktivnog programiranja je Excel tabela. Ako povežete nekoliko ćelija s jednom formulom, rezultat izračuna će se promijeniti svaki put kada se podaci u tim ćelijama promijene. Za računovodstvo je takva dinamična promjena podataka uobičajena stvar, ali za programere je prije izuzetak.

A=3; b=4; c=a+b; F1(c); a=1; F2(c);

U ovom primjeru, funkcije F1 i F2 će raditi s različitim vrijednostima varijable C. Često je potrebno da obje funkcije imaju samo najažurnije podatke - reaktivno programiranje će vam omogućiti da odmah pozovete F1 s novim parametara bez promjene logike samih funkcija. Ova struktura koda daje aplikaciji mogućnost da trenutno odgovori na sve promjene, što će je učiniti brzom, fleksibilnom i brzom.

ReactiveX

Implementacija ideja reaktivnog programiranja od nule može biti prilično problematična - postoje zamke i trebat će pristojno vrijeme. Stoga je za mnoge programere ova paradigma ostala samo teorijski materijal sve dok se nije pojavio ReactiveX.

ReactiveX framework je alat za reaktivno programiranje koji radi sa svim popularnim OOP jezicima. Sami kreatori to nazivaju multi-platformskim API-jem za asinhroni razvoj, zasnovan na obrascu Observer.

Ako je termin "reaktivno programiranje" neka vrsta teorijskog modela, onda je obrazac Observer gotov mehanizam za praćenje promjena u programu. I morate ih pratiti prilično često: učitavanje i ažuriranje podataka, obavijesti o događajima i tako dalje.

Observer obrazac postoji otprilike koliko i sam OOP. Objekt čije se stanje može promijeniti naziva se izdavač (popularni prijevod termina Observable). Svi ostali učesnici koji su zainteresovani za ove promene su pretplatnici (Observer, Subscriber). Za primanje obavještenja, pretplatnici se registruju kod izdavača eksplicitnim navođenjem svog ID-a. Izdavač s vremena na vrijeme generira obavještenja, koja izdavač šalje na listu registriranih pretplatnika.

Zapravo, kreatori ReactiveX-a nisu smislili ništa revolucionarno, samo su prikladno implementirali obrazac. Iako mnogi OOP jezici, a posebno Java, imaju gotove implementacije šablona, ​​ovaj okvir ima dodatno "podešavanje" koje pretvara "Observer" u veoma moćan alat.

RxAndroid

Port ReactiveX biblioteke za Android svijet se zove rxAndroid i povezan je, kao i uvijek, preko Gradle-a.

Sastavite "io.reactivex:rxandroid:1.1.0"

Izdavač koji generira obavještenja je naveden ovdje pomoću klase Observable. Izdavač može imati nekoliko pretplatnika; da bismo ih implementirali, koristit ćemo klasu Subscriber. Zadano ponašanje za Observable je izdavanje jedne ili više poruka pretplatnicima, a zatim izlaz ili poruka o grešci. Poruke mogu biti i varijable i cjelobrojni objekti.

Rx.Observable myObserv = rx.Observable.create(new rx.Observable.OnSubscribe () ( @Override javni nevažeći poziv (Pretplatnikpretplatnik) ( subscriber.onNext("Zdravo"); subscriber.onNext("svijet"); subscriber.onCompleted(); ) ));

U ovom slučaju, myObserv izdavač će prvo poslati nizove pozdrava i poruke, a zatim i poruku o uspjehu. Izdavač može pozvati metode onNext(), onCompleted() i onEror(), tako da ih pretplatnici moraju definirati.

Pretplatnik mySub = novi pretplatnik () (... @Override public void onNext(Vrednost niza) (Log.e("dobio sam podatke", " " + vrijednost);) );

Sve je spremno za rad. Ostaje povezati objekte jedni s drugima - i "Zdravo, svijete!" u reaktivnom programiranju je spreman!

MyObserv.subscribe(mySub);

Moram reći da je ovo bio vrlo jednostavan primjer. ReactiveX ima mnogo opcija za ponašanje svih učesnika u obrascu: filtriranje, grupisanje, rukovanje greškama. Prednosti reaktivnog programiranja mogu se osjetiti samo ako se isproba na djelu. Pređimo ozbiljnije na zadatak.

I dalje dostupno samo članovima

Opcija 1. Pridružite se zajednici "site" da pročitate sve materijale na stranici

Članstvo u zajednici tokom navedenog perioda će vam omogućiti pristup SVIM Hakerskim materijalima, povećati vaš lični kumulativni popust i omogućiti vam da sakupite profesionalnu ocjenu Xakep Score!

Idi.

Reaktivno programiranje na početku zvuči kao naziv paradigme u nastajanju, ali se zapravo odnosi na metodu programiranja koja koristi pristup vođen događajima za rad sa asinhronim tokovima podataka. Na osnovu stalno aktuelnih podataka, reaktivni sistemi reaguju na njih izvršavanjem niza događaja.
Reaktivno programiranje prati obrazac dizajna Observer-a, koji se može definirati na sljedeći način: ako dođe do promjene stanja u jednom objektu, tada se svi ostali objekti obavještavaju i ažuriraju u skladu s tim. Dakle, umjesto anketiranja događaja za promjene, događaji se guraju asinhrono tako da ih posmatrači mogu obraditi. U ovom primjeru, promatrači su funkcije koje se izvršavaju kada se neki događaj pošalje. A spomenuti tok podataka je stvarna vidljiva.

Gotovo svi jezici i okviri koriste ovaj pristup u svom ekosistemu, a najnovije verzije Jave nisu izuzetak. U ovom članku ću objasniti kako se reaktivno programiranje može primijeniti koristeći najnoviju verziju JAX-RS u Java EE 8 i Java 8 funkcionalnosti.

Reaktivni manifest

Reaktivni manifest navodi četiri osnovna aspekta da aplikacija treba da bude fleksibilnija, labavo povezana i laka za skalaciju, te stoga sposobna da bude reaktivna. Kaže da aplikacija mora biti prilagodljiva, fleksibilna (i stoga skalabilna), otporna i vođena porukama.

Osnovni cilj je zaista prilagodljiva aplikacija. Recimo da imate aplikaciju koja ima jednu veliku nit koja obrađuje korisničke zahtjeve, a kada se posao završi, ta nit šalje odgovore natrag originalnim podnosiocima zahtjeva. Kada aplikacija primi više zahtjeva nego što može podnijeti, ovaj tok postaje usko grlo i aplikacija gubi prijašnji odgovor. Da bi ostala brza, aplikacija mora biti skalabilna i otporna. Otporna aplikacija je ona koja ima funkciju automatskog oporavka. Prema iskustvu većine programera, samo arhitektura vođena porukama omogućava da aplikacija bude skalabilna, robusna i brza.

Reaktivno programiranje je uvedeno u Javi 8 i Java EE 8. Jezik Java je uveo koncepte kao što su CompletionStage i njegova implementacija CompletableFuture, a Java je počela da koristi ove karakteristike u specifikacijama kao što je Reactive Client API u JAX-RS.

JAX-RS 2.1 Reaktivni klijentski API

Pogledajmo kako se reaktivno programiranje može koristiti u aplikacijama Java EE 8. Da biste razumjeli proces, potrebno vam je osnovno znanje o Java EE API-ju.

JAX-RS 2.1 uveo je novi način kreiranja reaktivnog REST klijenta. Podrazumevana implementacija invokera koju nudi JAX-RS je sinhrona, što znači da će klijent koji se kreira poslati blokirajući poziv na krajnju tačku servera. Primjer implementacije je dat u Listingu 1.

Odgovor odgovora = ClientBuilder.newClient() .target("http://localhost:8080/service-url") .request() .get();
Počevši od verzije 2.0, JAX-RS pruža podršku za kreiranje asinhronog invokera na klijentskom API-ju jednostavnim pozivom metode async(), kao što je prikazano u Listingu 2.

Budućnost odgovor = ClientBuilder.newClient() .target("http://localhost:8080/service-url") .request() .async() .get();
Korišćenje asinhronog invokera na klijentu vraća Future instancu tipa javax.ws.rs.core.Response. Ovo može rezultirati anketiranjem za odgovor, pozivanjem future.get() ili registriranjem povratnog poziva koji će biti pozvan kada postoji dostupan HTTP odgovor. Obje implementacije su prikladne za asinkrono programiranje, ali stvari imaju tendenciju da postanu složenije ako želite grupirati povratne pozive ili dodati uslovne slučajeve tim minimumima asinhronog izvršavanja.

JAX-RS 2.1 pruža reaktivan način za prevazilaženje ovih problema sa novim JAX-RS Reactive Client API za sklapanje klijenta. To je jednostavno kao pozivanje metode rx() tokom izgradnje klijenta. U Listingu 3, metoda rx() vraća reaktivni invoker koji postoji tokom izvršavanja klijenta, a klijent vraća odgovor tipa CompletionStage.rx() , koji omogućava prijelaz sa sinhronog pozivača na asinhroni invoker jednostavnim poziv.

CompletionStage odgovor = ClientBuilder.newClient() .target("http://localhost:8080/service-url") .request() .rx() .get();
CompletionStage<Т>je novi interfejs predstavljen u Javi 8. Predstavlja proračun, koji može biti korak u okviru većeg proračuna, kao što ime govori. Ovo je jedina Java 8 reaktivnost koja je dospjela u JAX-RS.
Nakon što primim instancu odgovora, mogu pozvati AcceptAsync() , gdje mogu dati dio koda koji će se izvršiti asinhrono kada odgovor postane dostupan, kao što je prikazano u Listingu 4.

Response.thenAcceptAsync(res -> ( Temperatura t = res.readEntity(Temperature.class); //radi stvari sa t));
Dodavanje reaktivnosti na REST krajnju tačku

Reaktivni pristup nije ograničen na stranu klijenta u JAX-RS; može se koristiti i na strani servera. Kao primjer, prvo ću kreirati jednostavnu skriptu u kojoj mogu zatražiti listu lokacija za jedno odredište. Za svaku poziciju, napravit ću poseban poziv s podacima o lokaciji do druge točke da dobijem vrijednosti temperature. Interakcija odredišta će biti kao što je prikazano na slici 1.

Slika 1. Interakcija između odredišta

Prvo samo definiram model domene, a zatim usluge za svaki model. Listing 5 pokazuje kako je definirana klasa Forecast, koja obavija klase Lokacija i Temperatura.

Javna klasa Temperatura (privatna Dvostruka temperatura; privatna string skala; // getteri i seteri) javna klasa Lokacija (naziv niza; javna Lokacija() () javna Lokacija(naziv niza) ( this.name = name; ) // getteri i seteri ) javna klasa Forecast ( privatna lokacija lokacije; privatna temperatura temperature; javna prognoza(lokacija lokacije) ( this.location = lokacija; ) javna prognoza setTemperature (konačna temperatura temperature) ( this.temperature = temperatura; vrati ovo; ) // getters )
Za omotavanje liste predviđanja, klasa ServiceResponse implementirana je u Listing 6.

Javna klasa ServiceResponse (privatno dugo vrijeme obrade; privatna lista prognoze = novi ArrayList<>(); public void setProcessingTime(long processingTime) ( this.processingTime = processingTime; ) prognoze javnog odgovora usluge (Lista prognoze) ( this.forecasts = prognoze; vrati ovo; ) // getters )
LocationResource, prikazan na Listingu 7, definira tri uzorka lokacija vraćenih putem /location.

@Path("/location") javna klasa LocationResource ( @GET @Produces(MediaType.APPLICATION_JSON) javni odgovor getLocations() ( Lista lokacije = nova lista polja<>(); locations.add(nova Lokacija("London")); locations.add(nova Lokacija("Istanbul")); locations.add(nova Lokacija("Prag")); return Response.ok(new GenericEntity >(lokacije)()).build(); ) )
TemperatureResource , prikazan na Listingu 8, vraća nasumično generiranu vrijednost temperature između 30 i 50 za datu lokaciju. Kašnjenje od 500 ms je dodato implementaciji kako bi se simuliralo očitavanje senzora.

@Path("/temperature") javna klasa TemperatureResource ( @GET @Path("/(city)") @Produces(MediaType.APPLICATION_JSON) javni odgovor getAverageTemperature(@PathParam("city") String cityName) (temperatura temperature = novo Temperature(); temperature.setTemperature((double) (novi Random().nextInt(20) + 30)); temperature.setScale("Celsius"); pokušajte ( Thread.sleep(500); ) catch (InterruptedException ignorisan) ( ignored.printStackTrace(); ) return Response.ok(temperature).build(); ) )
Prvo ću pokazati implementaciju sinkronog ForecastResource (pogledajte Listing 9) koji vraća sve lokacije. Zatim, za svaku poziciju, poziva temperaturnu službu da dobije vrijednosti u stepenima Celzijusa.

@Path("/forecast") javna klasa ForecastResource ( @Uri("location") privatni WebTarget locationTarget; @Uri("temperature/(city)") privatni WebTarget temperatureTarget; @GET @Produces(MediaType.APPLICATION_JSON) javni odgovor getLocationsWithTemper () ( dugo startTime = System.currentTimeMillis(); ServiceResponse odgovor = new ServiceResponse(); Lista locations = locationTarget .request() .get(new GenericType >()()); forEach(location -> ( Temperatura temperature = temperatureTarget .resolveTemplate("city", location.getName()) .request() .get(Temperature.class); response.getForecasts().add(new Forecast(location) .setTemperature (temperatura)); )); long endTime = System.currentTimeMillis(); response.setProcessingTime(endTime - startTime); return Response.ok(response).build(); ) )
Kada je odredište prognoze zatraženo kao /forecast, dobićete izlaz sličan Listingu 10. Imajte na umu da je zahtjevu trebalo 1.533 ms da se obradi, što je logično jer zahtjev za temperaturom sa tri različite lokacije sinhrono dodaje do 1,5 ms.

( "prognoze": [ ( "lokacija": ( "ime": "London" ), "temperatura": ( "skala": "Celzijus", "temperatura": 33 ) ), ( "lokacija": ( "ime ": "Istanbul" ), "temperatura": ( "skala": "Celzijus", "temperatura": 38) ), ( "lokacija": ( "ime": "Prag" ), "temperatura": ( "skala ": "Celzijus", "temperatura": 46 ) ) ], "vrijeme obrade": 1533 )
Za sada sve ide po planu. Vrijeme je da se uvede reaktivno programiranje na strani servera, gdje se pozivi ka svakoj lokaciji mogu uputiti paralelno nakon što se sve lokacije prime. Ovo može jasno poboljšati sinhroni tok prikazan ranije. Ovo se radi u Listingu 11, koji pokazuje definiciju reaktivne verzije usluge prognoze.

@Path("/reactiveForecast") javna klasa ForecastReactiveResource ( @Uri("location") private WebTarget locationTarget; @Uri("temperature/(city)") private WebTarget temperatureTarget; @GET @Produces(MediaType.APPLICATION_JSON) public void getTLocationsatureWi (@Suspended final AsyncResponse async) ( long startTime = System.currentTimeMillis(); // Kreirajte fazu za preuzimanje lokacija CompletionStage > locationCS = locationTarget.request() .rx() .get(new GenericType >() ()); // Kreiranjem zasebne faze u fazi lokacija, // gore opisanom, prikupimo listu predviđanja // kao u jednoj velikoj finalnoj fazi CompletionStage CompletionStage > forecastCS = locationCS.thenCompose(locations -> ( // Kreirajte fazu da biste dobili prognoze // kao CompletionStage List > forecastList = // Stream lokacije i obraditi svaku // posebno locations.stream().map(location -> ( // Kreirajte korak da dobijete // temperature samo jednog grada // po njegovom nazivu finalna faza CompletionStage tempCS = temperatureTarget .resolveTemplate("grad", location.getName()) .request() .rx() .get(Temperature.class); // Zatim kreirajte CompletableFuture koja // sadrži instancu prognoze sa // lokacijom i vrijednošću temperature return CompletableFuture.completedFuture(new Forecast(location)) .thenCombine(tempCS, Forecast::setTemperature); )).collect(Collectors.toList()); // Vraća konačnu instancu CompletableFuture gdje su // svi predstavljeni dovršeni budući objekti // završeni vraćaju CompletableFuture.allOf(forecastList.toArray(new CompletableFuture)) .thenApply(v -> forecastList.stream() .map(CompletionStage::toComplete) ) .map(CompletableFuture::join) .collect(Collectors.toList())); )); // Kreirajte instancu ServiceResponse koja // sadrži punu listu predviđanja // zajedno s vremenom obrade. // Kreirajte njegovu budućnost i kombinirajte je sa // forecastCS da biste dobili prognoze // i ubacite u odgovor usluge CompletableFuture.completedFuture(new ServiceResponse()) .thenCombine(forecastCS, ServiceResponse::forecasts) .whenCompleteAsync((response, throwable) - > ( response.setProcessingTime(System.currentTimeMillis() - startTime); async.resume(response); )); ) )
Reaktivna implementacija se na prvi pogled može činiti komplikovanom, ali nakon detaljnijeg pogleda, primijetit ćete da je prilično jednostavna. U implementaciji ForecastReactiveResource, prvo upućujem klijentski poziv uslugama lokacije koristeći JAX-RS Reactive Client API. Kao što sam već spomenuo, ovo je dodatak za Java EE 8 i pomaže da se kreira reaktivni poziv jednostavno pomoću rx() metode.

Sada kreiram novu fazu na osnovu lokacije za prikupljanje liste predviđanja. Oni će biti pohranjeni kao lista prognoza u jednoj velikoj fazi završetka koja se zove forecastCS. Na kraju, kreiraću odgovor na poziv usluge koristeći samo forecastCS.

Sada sakupimo prognoze kao listu faza završetka definisanih u varijabli forecastList. Da kreiram fazu završetka za svaku prognozu, prosljeđujem podatke o lokaciji i zatim kreiram tempCS varijablu, opet koristeći JAX-RS Reactive Client API, koji poziva temperaturnu uslugu s imenom grada. Ovdje koristim metodu resolveTemplate() za izgradnju klijenta, a to mi omogućava da graditelju kao parametar prenesem ime grada.

Kao posljednji korak striminga, pozivam CompletableFuture.completedFuture() , prosljeđujući novu instancu Forecast kao parametar. Kombiniram ovu budućnost sa tempCS fazom tako da imam vrijednost temperature za iterirane lokacije.

CompletableFuture.allOf() metoda u Listingu 11 pretvara listu faza završetka u forecastCS. Izvršavanje ovog koraka vraća veliku dovršenu budućnost kada se dovrše sve isporučene dovršene budućnosti.

Odgovor usluge je instanca klase ServiceResponse, tako da kreiram završenu budućnost i zatim spajam fazu završetka forecastCS sa listom prognoza i izračunavam vrijeme odgovora usluge.

Naravno, reaktivno programiranje samo prisiljava serversku stranu da se izvršava asinhrono; strana klijenta će blokirati sve dok server ne pošalje odgovor nazad tražitelju. Da bi se prevazišao ovaj problem, server poslani događaji (SSE) se mogu koristiti za slanje delimičnog odgovora čim bude dostupan, tako da se vrednosti temperature za svaku lokaciju šalju klijentu jednu po jednu. Izlaz ForecastReactiveResource će biti sličan Listingu 12. Kao što je prikazano u izlazu, vrijeme obrade je 515ms, što je idealno vrijeme izvršenja za dobivanje vrijednosti temperature sa jedne lokacije.

( "prognoze": [ ( "lokacija": ( "ime": "London" ), "temperatura": ( "skala": "Celzijus", "temperatura": 49 ) ), ( "lokacija": ( "ime ": "Istanbul" ), "temperatura": ( "skala": "Celzijus", "temperatura": 32 ) ), ( "lokacija": ( "ime": "Prag" ), "temperatura": ( "skala ": "Celzijus", "temperatura": 45 ) ) ], "vrijeme obrade": 515 )
Zaključak

U primjerima u ovom članku prvo sam pokazao sinhroni način dobivanja prognoza pomoću usluga lokacije i temperature. Zatim sam se prebacio na reaktivni pristup kako bi se izvršila asinhrona obrada između poziva usluge. Kada koristite JAX-RS Reactive Client API u Javi EE 8 zajedno sa klasama CompletionStage i CompletableFuture dostupnim u Javi 8, moć asinhrone obrade oslobađa se kroz reaktivno programiranje.

Reaktivno programiranje je više od obične implementacije asinhronog modela iz sinhronog; takođe pojednostavljuje koncepte kao što je faza gnežđenja. Što se više koristi, to će biti lakše upravljati složenim scenarijima u paralelnom programiranju.

Hvala vam na pažnji. Kao i uvijek, dobrodošli smo vašim komentarima i pitanjima.

Možete pomoći i prenijeti neka sredstva za razvoj stranice

Provjerite informacije. Potrebno je provjeriti tačnost činjenica i pouzdanost informacija iznesenih u ovom članku. Trebalo bi da postoje objašnjenja na stranici za razgovor... Wikipedia

Interaktivnost je koncept koji otkriva prirodu i stepen interakcije između objekata. Koristi se u oblastima: teorija informacija, računarstvo i programiranje, telekomunikacioni sistemi, sociologija, industrijski dizajn i dr. U ... ... Wikipediji

Ovaj članak bi trebao biti vikifikovan. Molimo vas da ga formatirate prema pravilima za formatiranje članaka. Ovaj izraz ima druga značenja, pogledajte Electromash (značenja) ... Wikipedia

stranim psihoterapijskim tehnikama- DEEP TECHNIQUES Aktivna psihoterapija (Fromm Reichmann). Analiza bića (Binswanger). Analiza sudbine (Sondi). Analiza karaktera (W. Reich). Analiza I (H. Kohut, E. Erickson). Terapija analitičkom igrom (M. Klein). Porodična analitička terapija (Richter).… Velika psihološka enciklopedija

Knjige

  • Reaktivno programiranje u C++. Dizajniranje paralelnih i asinhronih aplikacija, Pai Praseed, Abraham Peter. Dizajniranje paralelnih i asinhronih aplikacija koristeći RxCpp biblioteku i moderni C++ 17 Podržani alati za paralelno programiranje Suradnički…
  • , Nurkevič T., Christensen B.. U ovim danima, kada su programi asinhroni, a brza reakcija je najvažnija osobina, reaktivno programiranje će pomoći u pisanju pouzdanijeg, bolje skalabilnog i bržeg koda.…
  • Reaktivno programiranje sa RxJava, Tomas Nurkevič, Ben Christensen. U današnje vrijeme, kada su programi asinhroni i kada je brzi odgovor najvažnije svojstvo, reaktivno programiranje će vam pomoći da napišete pouzdaniji, bolje skalabilan i brži kod.…

Principi reaktivnog programiranja nisu novi i mogu se pratiti do temeljnog rada Jima Graya i Pat Hellanda na tandem sistemu 70-ih i 80-ih godina.

Ovi ljudi su bili daleko ispred svog vremena. Tek u posljednjih 5-10 godina tehnološka industrija je bila prisiljena da revidira postojeće "najbolje prakse" za razvoj sistema preduzeća. Naučila je primijeniti znanje o reaktivnim principima današnjeg svijeta multi-core i cloud computinga.

Osnova za reaktivni sistem je prenošenje poruka, koje stvara vremensku granicu između komponenti, omogućava im da budu odvojene u vremenu koristeći paralelizam i prostor, koji raspoređuje opterećenje i obezbeđuje mobilnost. Ovo razdvajanje je uslov za potpunu izolaciju između komponenti i čini osnovu za stabilnost i otpornost sistema.

Osnove reaktivnog programiranja

Ovo programiranje se fokusira na protok informacija i širenje promjena podataka. Kada koristite programske jezike, lako je odvojiti statičke i dinamičke tokove, dok će osnovni model automatski propagirati promjene kroz sve tokove podataka. Jednostavnim rečima, u Rx programiranju, koje emituje jedna komponenta, i osnovna struktura koju obezbeđuju Rx biblioteke, propagiraće te promene na drugu komponentu registrovanu da prima te promene. Reaktivno programiranje Rx se sastoji od tri ključne tačke.

Glavne funkcije komponenti:

  1. Opservables nisu ništa drugo do tokovi podataka. Opservable pakuje podatke koji se mogu proslijediti iz jednog toka u drugi. Oni u osnovi emituju podatke periodično ili samo jednom u svom životnom ciklusu na osnovu konfiguracija. Postoje različiti operateri koji mogu pomoći posmatraču da pošalje neke specifične podatke na osnovu određenih događaja.
  2. Posmatrači konzumiraju tok podataka koji emituje posmatrač. Posmatrači se pretplaćuju koristeći subscribeOn() metod reaktivnog programiranja za primanje podataka koji se prenose do posmatrača. Kad god posmatrač preda podatke, svi registrovani posmatrači primaju podatke u onNext() povratnom pozivu. Ovdje mogu obavljati različite operacije kao što je raščlanjivanje JSON odgovora ili ažuriranje korisničkog interfejsa. Ako postoji greška uzrokovana promatračem, promatrač će je dobiti u onError().
  3. Planeri (raspored) su komponenta u Rx-u koja govori promatračima i promatračima na kojoj niti trebaju pokrenuti. Možete koristiti metod observOn() da kažete posmatračima na kojoj niti treba da gledaju. Alternativno, schedOn() se može koristiti da kaže opservabilu na kojoj niti treba pokrenuti.

U reaktivnom programiranju koristeći RxJava zadane osnovne niti poput Schedulers.newThread() će kreirati novu pozadinu. Schedulers.io() će izvršiti kod na I/O niti.

Glavne prednosti Rx-a su povećana upotreba računarskih resursa na višejezgrenom i višeprocesorskom hardveru, poboljšane performanse smanjenjem poena i poboljšane performanse smanjenjem serijalacionih tačaka, prema Amdahlovom zakonu i Güntherovom zakonu o univerzalnoj skalabilnosti.

Druga prednost je visoka produktivnost za programere jer su se tradicionalne paradigme programiranja borile da obezbede jednostavan pristup koji se može održavati u radu sa asinhronim i neblokirajućim računanjem i IO. Funkcionalno reaktivno programiranje rješava ove zadatke jer obično eliminira potrebu za eksplicitnom koordinacijom između aktivnih komponenti.

Tamo gdje se javlja Rx, kreira se proces kreiranja komponenti i sastav tokova posla. Da biste u potpunosti iskoristili prednosti asinhronog izvršavanja, omogućavanje povratnog pritiska je ključno kako bi se izbjegla prekomjerna upotreba ili radije neograničena potrošnja resursa. Da bi se osiguralo stabilno stanje u smislu protoka podataka, protupritisak zasnovan na opterećenju šalje zahtjev koji teče uzvodno i prima poruke.

Dakle, glavne prednosti sistema su:

  1. Povećane performanse - zahvaljujući mogućnosti brze i dosljedne obrade ogromnih količina podataka.
  2. Poboljšan UX - zbog činjenice da aplikacija bolje reagira na korisnika.
  3. Pojednostavljene modifikacije i ažuriranja - zahvaljujući čitljivijem i lakše predvidljivom kodu.

Ali iako je reaktivno programiranje veoma korisna stvar pri izgradnji modernog softvera, da biste razmišljali o sistemu na višem nivou, potrebno je koristiti još jedan alat - Reaktivnu arhitekturu za proces projektovanja reaktivnih sistema. Takođe, važno je zapamtiti da postoji mnogo programskih paradigmi i Rx je samo jedna od njih, kao i svaki alat, nije dizajniran za sve slučajeve upotrebe.

Reaktivna stabilnost sistema

Otpornost je odgovor na kvar i inherentno je funkcionalno svojstvo sistema. Potreban je razvoj, a ne samo retroaktivni dodatak sistemu. Otpornost reaktivnog javascript programiranja prevazilazi toleranciju grešaka i nije zbog degradacije, ali u slučaju neuspjeha može se potpuno ispraviti.

Ovo zahtijeva izolaciju komponenti i zadržavanje kvarova kako bi se izbjeglo širenje kvarova na susjedne komponente, što može dovesti do katastrofalnih scenarija kaskadnog kvara. Dakle, ključ za izgradnju otpornih sistema je da se oni mogu okarakterisati kao poruke poslane drugim komponentama koje deluju kao supervizori i kojima se upravlja iz bezbednog konteksta izvan neispravne komponente.

Ovdje, budući da su vođeni porukama, ovi objekti se udaljavaju od čvrsto povezanih, krhkih, duboko ugniježđenih sinhronih lanaca poziva koji se uglavnom zanemaruju. Ideja je da se odvoji rukovanje kvarovima od lanca poziva, na primjer oslobađanjem klijenta od odgovornosti rukovanja kvarovima servera.

Budući da je većina sistema inherentno složena, jedan od najvažnijih aspekata je osigurati da arhitektura sistema osigurava minimalnu degradaciju performansi kako u razvoju tako iu održavanju komponenti, dok se u isto vrijeme nasumična složenost svede na minimum. Ovo je važno jer tokom životnog ciklusa sistema, ako nije pravilno dizajniran, biće sve teže održavati ga u radu, a biće potrebno više vremena i truda za razumevanje kako bi se izolovali i popravili problemi.

Reaktivni sistemi predstavljaju najproduktivniju sistemsku arhitekturu, u kontekstu višejezgrene, cloud i mobilne arhitekture:

  1. Izolacija kvarova nudi pregrade između komponenti, sprečavajući kaskadne kvarove i ograničavajući obim i ozbiljnost kvarova.
  2. Hijerarhije supervizora nude višestruke nivoe zaštite u kombinaciji sa mogućnostima samoizlečenja, što eliminiše mnoge privremene kvarove bilo kakvog operativnog troška za istragu.
  3. Preskakanje poruka i transparentnost lokacije omogućavaju vam da onemogućite i zamijenite komponente bez utjecaja na iskustvo krajnjeg korisnika. Ovo smanjuje troškove kvarova, njihovu relativnu hitnost i resurse potrebne za njihovo dijagnosticiranje i popravljanje.
  4. Replikacija smanjuje rizik od gubitka podataka i smanjuje utjecaj neuspjeha na dostupnost preuzimanja i skladištenja informacija.
  5. Elastičnost omogućava da se resursi sačuvaju kako upotreba varira, minimizirajući operativne troškove pri niskom opterećenju i rizik od kvara ili hitno ulaganje u skalabilnost kako opterećenje raste.

Web aplikacije mogu imati velike koristi od stila razvoja Rx, koji vam omogućava da sastavite tokove posla zahtjev-odgovor koji uključuju grananje na pozive usluga, asinhrono pronalaženje resursa i sastav odgovora, te naknadno sortiranje za klijenta. U skorije vrijeme, push-to-server događaji i web utičnice postaju sve češći u praksi, a za ovo u velikoj mjeri potreban je efikasan način za pohranjivanje mnogih otvorenih veza i gdje IO nije blokiran.

Postoje alati za to, kao što su Streams i Futures, koji olakšavaju neblokirajuće i asinkrone konverzije i guraju ih do klijenata. Reaktivno programiranje sloja pristupa podacima - Ažurira i traži podatke u efikasnom resursu, po mogućnosti koristeći SQL ili NoSQL baze podataka sa asinhronim drajverima.

Web aplikacije takođe imaju koristi od razvoja reaktivnog sistema za stvari kao što su distribuirano keširanje, konzistentnost podataka i obaveštenja sa više čvorova. Tradicionalne web aplikacije obično koriste stajaće čvorove. Ali čim programeri počnu da koriste Server-Sent-Events (SSE) i WebSockets, ovi čvorovi postaju operativni, jer, u najmanju ruku, održavaju stanje klijentske veze i u skladu s tim im se šalju push obavijesti. To zahtijeva razvoj reaktivnog sistema, jer je to oblast u kojoj je obraćanje primaocima putem poruka važno.

Suština Java reaktivnog programiranja

Nije obavezno koristiti Rx u reaktivnim sistemima. Jer Rx programiranje i reaktivni sistemi nisu ista stvar. Iako se često koriste naizmjenično, nisu baš sinonimi i odražavaju različite stvari. Sistemi predstavljaju sljedeći nivo "reaktivnosti". Ovaj nivo podrazumeva specifične dizajnerske i arhitektonske odluke koje vam omogućavaju da kreirate robusne i fleksibilne aplikacije.

Međutim, vrlo dobra ideja – kombinacija metoda – donosi još više koristi aplikacijama, jer ih čini još povezanijim, omogućava efikasnije korištenje resursa i osigurava manje kašnjenje. Kada su u pitanju ogromne količine podataka ili obavljanje više zadataka, asinhrona obrada je često potrebna da bi sistemi bili brzi i brzi.

U Javi, naslijeđu starog objektno orijentiranog programiranja, asinhronija može postati zaista komplikovana i učiniti kod teškim za razumijevanje i održavanje. Stoga je Rx posebno koristan za ovo "čisto" objektno orijentirano okruženje jer olakšava rad sa asinhronim nitima.

Sa svojim najnovijim izdanjima, počevši od Jave 8, sama Java je napravila neke pokušaje da implementira izvornu reaktivnost, ali ti pokušaji danas nisu baš popularni kod programera. Međutim, postoje neke žive i redovno ažurirane implementacije trećih strana za reaktivno Java programiranje koje mogu spasiti dan i stoga ih Java programeri posebno cijene.

U tipičnoj aplikaciji, uobičajeno je da se neke operacije reaktivnog programiranja više puta izvode koristeći RxJava, tako da morate uporediti brzinu, CPU i upotrebu memorije sa istim operacijama koje su implementirane i sa Kotlin korutinama i sa RxJava. Ovo je početni test performansi.

Kad god se primijeni novi alat koji će se široko koristiti u cijelom kodu, važno je razumjeti hoće li to utjecati na ukupnu izvedbu aplikacije prije nego što odlučite da li ga vrijedi koristiti. Praksa upotrebe daje kratak odgovor: u većini slučajeva, korisnici bi trebali razmotriti zamjenu RxJava sa Kotlin korutinama, posebno u Androidu.

Reaktivno programiranje koristeći RxJava i dalje se može koristiti u ograničenom broju slučajeva, iu tim slučajevima, i RxJava i korutine se mogu miješati.

Jednostavni razlozi:

  1. Oni pružaju mnogo veću fleksibilnost od običnog Rx-a.
  2. Pruža bogat skup operatora za kolekcije koje će izgledati isto kao i kod RxJava operatora.
  3. Kotlin reaktivno programiranje može komunicirati kada je potrebno koristeći rxjava.
  4. Vrlo su lagani i efikasni s obzirom na veću upotrebu CPU-a za prikupljanje smeća iz svih objekata koje je kreirala RxJava.

Reactive Extensions

Reactive Extensions (ReactiveX ili RX) je biblioteka koja slijedi principe Rx-a, tj. sastavljanje asinhronih programa i programa zasnovanih na događajima koristeći vidljivi niz. Ove biblioteke pružaju mnoga sučelja i metode koje pomažu programerima da pišu čist i jednostavan kod.

Reaktivne ekstenzije su dostupne na nekoliko jezika. Programeri su posebno zainteresovani za RxJava i RxAndroid jer je android oblast koja se najviše fokusira.

Reaktivno programiranje koristeći RxJava je implementacija Java Reactive Extension iz Netflixa. U osnovi, to je biblioteka koja sastavlja asinhrone događaje prateći obrazac posmatrača.

Moguće je kreirati asinhroni saobraćaj, transformisati ih i konzumirati od strane posmatrača u različitim tokovima podataka. Biblioteka nudi širok spektar neverovatnih operatora kao što su mapa, pridruživanje i filter koji se mogu primeniti na tok podataka. Kako programer počne koristiti stvarne primjere koda, naučit će više o operatorima i konverzijama.

Multithreading u Android aplikacijama

Android" class="if uuid-2938324" src="/misc/i/gallery/73564/2938324.jpg" />

Android reaktivno programiranje (RxAndroid) specifično je za Android platformu sa nekoliko dodatih klasa na vrhu RxJave. Tačnije, raspoređivači su predstavljeni u RxAndroidu (AndroidSchedulers.mainThread()), koji igra važnu ulogu u podršci konceptu višenitnog rada u Android aplikacijama.

Između ostalog, stručnjaci savjetuju korištenje samo RxJava biblioteke. Čak i zahvaljujući velikom broju planera koji se koriste u android programiranju.

Ispod je lista planera i njihov sažetak:

  1. Schedulers.io() - Koristi se za izvođenje neintenzivnih operacija kao što su mrežni pozivi, čitanje diskova/datoteka, operacije baze podataka i koji održava skup niti.
  2. AndroidSchedulers.mainThread() - Omogućava pristup glavnoj temi Thread/UI. Obično se operacije odvijaju u ovoj niti, kao što je ažuriranje korisničkog interfejsa, interakcija sa korisnikom. Stručnjaci savjetuju korisnike da ne bi trebali izvoditi nikakve intenzivne operacije na ovom streamu, jer to može uzrokovati pad aplikacije ili ANR dijalog.
  3. Schedulers.newThread() - Koristeći ovo, nova nit će biti kreirana svaki put kada je zadatak zakazan. Općenito se predlaže da se raspored ne koristi za vrlo duge poslove. Niti kreirane pomoću newThread() neće se ponovo koristiti.
  4. Schedulers.computation() - Ovaj raspored se može koristiti za izvođenje CPU intenzivnih operacija, za obradu ogromnih podataka reaktivnog programskog centra, za obradu bitmapa. Broj niti kreiranih pomoću ovog planera u potpunosti ovisi o broju dostupnih CPU jezgara.
  5. Schedulers.single() - Ovaj planer će izvršiti sve zadatke sljedećim redoslijedom, koji se može koristiti kada je potrebna potreba za sekvencijalnim izvršavanjem.
  6. Schedulers.immediate() - Ovaj planer izvršava zadatak odmah sinhrono blokirajući glavnu nit.
  7. Schedulers.trampoline() - Pokreće zadatke u načinu First In-First Out. Svi planirani zadaci će se izvoditi jedan za drugim, ograničavajući broj pozadinskih niti na jednu.
  8. Schedulers.from () - omogućava vam da kreirate planer od izvršitelja, ograničavajući broj kreiranih niti. Kada je spremište niti zauzeto, zadaci će biti stavljeni u red čekanja.

Sada kada imate dobru pozadinu u RxJava i RxAndroid, možete prijeći na neke primjere koda kako biste bolje razumjeli koncept. Da biste započeli, trebate dodati ovisnosti RxJava i RxAndroid u projekte build.gradle i sinkronizirati projekt.

Programiranje.

Observer je pretplaćen na Observable tako da može početi primati podatke koristeći dvije metode:

  1. SubscribeOn(Schedulers.io()) - govori Observable-u da započne zadatak na pozadinskoj niti.
  2. ObservOn(AndroidSchedulers.mainThread()) - govori Observeru da primi podatke na Android UI niti.

To je sve, tako da programer može napisati svoj prvi reaktivni programski program sa RxJava.

Preduzeća i dobavljači srednjeg softvera počeli su da koriste Reactive, a 2016-2018. je doživjelo ogroman porast korporativnog interesa za usvajanje ove paradigme.

Rx nudi performanse programera kroz efikasnost resursa na nivou komponente za internu logiku i transformaciju toka podataka, dok reaktivni sistemi nude performanse za arhitekte i DevOps kroz otpornost i elastičnost na nivou sistema. Koriste se za kreiranje "Cloud Native" i drugih velikih distribuiranih sistema. U praksi, knjige o Java reaktivnom programiranju se takođe široko koriste sa metodama koje vam omogućavaju da kombinujete principe dizajna reaktivnog sistema.



Učitavanje...
Top