Programavimas

Kas yra OSGi? Kitoks požiūris į „Java“ moduliškumą

OSGi padeda kurti ir valdyti modulinius „Java“ komponentus (vadinamus ryšuliai), kuriuos galima dislokuoti konteineryje. Kaip kūrėjas naudojate OSGi specifikaciją ir įrankius kurdami vieną ar daugiau paketų. OSGi apibrėžia šių paketų gyvavimo ciklą. Jis taip pat juos priima ir palaiko jų sąveiką talpykloje. Galite pagalvoti, kad OSGi konteineris yra maždaug analogiškas JVM, turintis papildomų galių. Taip pat pagalvokite apie paketus kaip apie unikalias galimybes turinčias „Java“ programas. Rinkiniai vykdomi OSGi konteinerio viduje kaip kliento ir serverio komponentai.

OSGi aljansas

„OSGi“ pradėjo veikti 1999 m., Skirtingai nei daugelis kitų specifikacijų, standarto nevaldo „Oracle“, „Java Community Process“ ar „Eclipse Foundation“. Vietoj to jį valdo OSGi aljansas.

Kuo skiriasi OSGi

OSGi filosofija skiriasi nuo kitų „Java“ pagrindu sukurtų sistemų, ypač „Spring“, filosofijos. OSGi tame pačiame konteineryje gali būti kelios programos: OSGi paketo vykdymo aplinka. Konteineris užtikrina, kad kiekvienas komponentas yra pakankamai izoliuotas, taip pat turi prieigą prie visų reikalingų priklausomybių. OSGi gali palaikyti priklausomybės injekciją, kurią standartizuoja „Aries Blueprint“ projektas. Be to, kad Avinas teikia OSGi valdymo inversijos (IoC) konteinerį, jis palaiko standartines „Java“ sistemas, tokias kaip „Java Persistence API“ (JPA).

„OSGi“ paketai gali atskleisti paslaugas, kuriomis naudojasi kiti rinkiniai. Rinkinys taip pat gali paskelbti versiją ir apibrėžti, nuo kokių dar paketų ji priklauso. Vykdymo laikas automatiškai įkels visus paketus priklausomybės tvarka. „OSGi“ gali egzistuoti kelios to paties rinkinio versijos, jei to reikalauja paketo priklausomybės.

OSGi „Eclipse IDE“ ir „Equinox“

Tam tikra forma OSGi gyvuoja jau porą dešimtmečių. Jis naudojamas daugeliui gerai žinomų programų, nuo įterptųjų mobiliųjų įrenginių iki programų serverių ir IDE.

Populiarus „Eclipse IDE“ yra pastatytas ant OSGi. „Eclipse“ OSGi konteinerio įgyvendinimas vadinamas „Equinox“. Tai puikus pavyzdys norint suprasti OSGi. Remiantis OSGi reiškia, kad „Equinox“ yra modulinė platforma. Jame yra įvairių paslaugų, kurias kūrėjai gali pridėti savo nuožiūra. Kiekvienas iš jų suteikia galimybę, kurios kūrėjui gali prireikti savo IDE. Galite pridėti „Java“ ir „JavaScript“ redaktorius, programų serverį ir duomenų bazės jungtį. Kiekvienas iš jų yra įgyvendinamas kaip OSGi rinkinys, kuris pridedamas prie sudėtinio rodinio ir gali sąveikauti su kitomis talpykloje esančiomis paslaugomis.

Neseniai kilo susidomėjimas OSGi naudojimu daiktų internetui (IoT). „OSGi“ yra natūralus šio tipo kūrinių pritaikymas, turintis įvairius programinės įrangos komponentus, veikiančius šalia įrenginių, nebūtinai žinodami vienas apie kitą. „OSGi“ konteineris suteikia paprastą ir standartizuotą būdą priglobti šiuos dinaminius programinės įrangos komponentus.

OSGi naudojimas „Java“ projekte: „Knoplerfish OSGi“

Mes sukursime pavyzdinę programą, kuri OSGi koncepcijas padarys konkretesnes. Mūsų pavyzdys pagrįstas „Knoplerfish OSGi“ vykdymo laiku, kuris naudojamas daugelyje gamybos diegimų. „Knoplerfish“ apima GUI ir komandinės eilutės sąsają (CLI), skirtą OSGi konteineriui ir jo paketams valdyti.

Pirmas dalykas, kurį atliksite, bus atsisiųsti „Knoplerfish“. Dabartinė versija šio rašymo metu yra „Knoplerfish OSGi 6.1.3“. Perskaitydami šį straipsnį galite pakeisti šią versiją naujausia.

Atsisiuntę ir įdiegę „Knoplerfish“, naudokite CLI, kad nukristumėte į katalogą, kuriame atsisiuntėte JAR failą, ir įveskite: java -jar framework.jar. Tai paleis vykdomąjį JAR ir turėtumėte pasveikinti su GUI langu.

„Knoplerfish OSGi“ GUI

„Knoplerfish OSGi“ GUI iš pradžių gali atrodyti didžiulė, tačiau pagrindai yra paprasti:

  • Ekrano viršuje yra meniu.
  • Kairėje yra rinkinių, kurie buvo įkelti į vykdymo laiką, rinkinys.
  • Dešinėje yra informacinis langas.
  • Apačioje yra teksto išvesties pultas.
  • Pačioje apačioje yra įvesties konsolė.
Matthew Tysonas

Tipas pagalba įvesties konsolėje, jei norite pamatyti pagalbos parinktis.

Prieš pereidami į pavyzdį, pažvelkite į veikiančių ryšulių rinkinį. Pamatysite paketą, vadinamą HTTP serveris, o tai reiškia, kad paketas, kuriame veikia HTTP serveris, yra. Eikite į savo naršyklę ir patikrinkite // localhost: 8080. Tikrai, pamatysite „Knoplerfish“ tinklalapį.

„Hello JavaWorld“ paketas

Panaudokime OSGi vykdymo laiką, kad sukurtume paprastą paketą, kurį aš pavadinsiu Sveiki, JavaWorld. Šis rinkinys išleidžia pranešimą į konsolę.

1 sąraše mes naudojame „Maven“ paketui sukurti. Tai turi tik vieną priklausomybę, kurią teikia OSGi aljansas.

Sąrašas 1. OSGi priklausomybė Maven POM

   org.osgi org.osgi.core 

Dabar mes taip pat naudosime papildinį naudodami „Apache Felix“ projektą. Šis papildinys rūpinasi, kad programa būtų pakuojama kaip OSGi paketas, skirtas naudoti. 2 sąraše rodoma konfigūracija, kurią naudosime.

2 „OSGi Felix“ papildinys „Maven POM“

   org.apache.felix maven-bundle-plugin true org.javaworld.osgi org.javaworld.osgi Sveiki 

Dabar galime pažvelgti į paprastą klasę, kuri išleis „Labas“.

Sąrašas 3. Sveiki „JavaWorld OSGi“ paketas

 paketas com.javaworld.osgi; importuoti org.osgi.framework.BundleActivator; importuoti org.osgi.framework.BundleContext; viešoji klasė „HelloJavaWorld“ įgyvendina „BundleActivator“ {public void start (BundleContext ctx) {System.out.println ("Hello JavaWorld."); } public void stop („BundleContext bundleContext“) {}} 

Sukurkite paketą eidami į komandinę eilutę ir įvesdami tekstą mvn clean install. Tai išves JAR failą, kuriame yra paketas. Dabar eikite į Failas meniu „Knoplerfish“ GUI ir pasirinkite Pridėti grupę. Tai suteiks failų naršyklę. Raskite ką tik pastatytą JAR ir pasirinkite jį.

Talpykloje esančių OSGi rinkinių tvarkymas

„Knoplerfish“ vartotojo sąsajos išvesties lange pamatysite pranešimą „Sveiki, JavaWorld“. „Knoplerfish“ GUI spustelėkite ant paketo ir pamatysite ID, kurį konteineris jam priskyrė. Kai būsite pasirengę sustabdyti rinkinį, galite spustelėti meniu „Sustabdyti“. Kitas būdas - įeiti sustabdyti [paketo numeris] komandinėje eilutėje. Sudėtyje esančius paketus galite tvarkyti naudodami GUI arba komandinę eilutę.

Dabar jūs jaučiatės, kaip paprastas rinkinys veikia OSGi talpykloje. Visur, kur egzistuoja „OSGi“ konteineris, rasite tą patį paprastumą pradėdami ir sustabdydami ryšulius. OSGi sukuria rinkinio aplinką ir gyvavimo ciklą.

„Bundle“ sąveika: paslaugos ir klientai

Toliau mes apžvelgsime, kaip ryšuliai bendrauja tarpusavyje.

Pirmas dalykas, kurį atliksime, yra sukurti paslaugų paketas. Paslaugų paketas yra analogiškas EJB sesijos pupelėms: jis teikia komponentą, prie kurio per nuotolinę sąsają gali pasiekti kiti paketai. Norėdami sukurti paslaugų paketą, turime pateikti ir sąsają, ir diegimo klasę.

Sąrašas 4. Paslaugų paketo sąsaja

 paketas com.javaworld.osgi.service; viešoji sąsaja WhatIsOsgi {public Integer addNum (Integer x, Integer y); } 

4 sąrašas yra paprasta sąsaja. Vienintelis metodas yra a addNum () metodas, kuris padarys tai, ką reiškia: grąžinkite dviejų skaičių pridėjimą. Įtraukimas, parodytas 5 sąraše, yra vienodai paprastas, tačiau pridedami keli OSGi būdai.

Sąrašas 5. Paslaugų paketo įgyvendinimas

 paketas com.javaworld.osgi.service; viešoji klasė „WhatIsOsgiImpl“ įgyvendina „WhatIsOsgi“, „BundleActivator“ {private ServiceReference ref; privatus „ServiceRegistration“ registras; @Paisyti viešąjį sveikąjį skaičių AddNum (Sveikasis skaičius x Sveikasis skaičius y) {grąžinti x + y; } @ Nepaisyti viešojo negaliojančio starto („BundleContext“ kontekstas) išmeta išimtį {reg = context.registerService (WhatIsOsgi.class, new WhatIsOsgiImpl (), new Hashtable ()); ref = reg.getReference (); } @Paisyti viešo tuštumo sustabdymą („BundleContext“ kontekstas) išmeta išimtį {reg.unregister (); }} 

Pažvelkime atidžiau į tai, kas vyksta 5 sąraše:

  1. viešoji klasė „WhatIsOsgiImpl“ įgyvendina „WhatIsOsgi“, „BundleActivator“: Čia mes įgyvendiname savo sukurtą sąsają. Atkreipkite dėmesį, kad mes taip pat įgyvendiname „BundleActivator“ sąsają, kaip mes darėme su SveikiJavaWorld pavyzdys. Pastarasis yra todėl, kad šis paketas suaktyvins save.
  2. privati ​​„ServiceReference ref“; privatus „ServiceRegistration“ registras;: Tai yra OSGi registracijos tarnybos ir šios paslaugos paketo nuorodos kintamieji.
  3. public Integer addNum (sveikas skaičius x, sveikas skaičius y): Tai paprastas metodo pridėjimas įgyvendinimas.
  4. vieša niekinė pradžia („BundleContext“ kontekstas): Šis pradžios metodas yra „BundleActivator“ sąsają, ir ją vykdo konteineris. Šiame pavyzdyje mes gauname nuorodą į OSGi registracijos tarnybą ir pritaikome ją savo KasIsOsgi sąsaja ir įgyvendinimas. Tuščias „Hashtable“ skirtas konfigūracijos parametrams, kurių čia nenaudojame. Taip pat gauname nuorodą į ką tik sukurtą paslaugą.
  5. public void stop („BundleContext“ kontekstas): Čia mes paprasčiausiai išregistruojame paslaugą. Ši paprasta paslauga tiesiog valdo pačius sunkiausius jos gyvenimo ciklo elementus. Pagrindinis jo tikslas yra atskleisti addNum metodas į OSGi konteinerį.

OSGi klientas

Toliau parašykime klientą, kuris gali naudotis paslauga. Šis klientas vėl naudosis „BundleActivator“ sąsaja. Tai taip pat pridės „ServiceListener“ sąsaja, kaip parodyta 6 sąraše.

Sąrašas 6. OSGi paslaugos kliento paketas

 viešoji klasė „OsgiClient“ įgyvendina „BundleActivator“, „ServiceListener“ {privatų „BundleContext ctx“; privati ​​„ServiceReference“ paslauga; public void start („BundleContext ctx“) {this.ctx = ctx; pabandykite {ctx.addServiceListener (this, "(objectclass =" + WhatIsOsgi.class.getName () + ")"); } gaudyti (InvalidSyntaxException ise) {ise.printStackTrace (); }}} 

6 sąraše yra pradžios metodas, kuris pridės paslaugų klausytoją. Šis klausytojas filtruojamas pagal paslaugos, kurią sukūrėme 5 sąraše, klasės pavadinimą. Kai paslauga bus atnaujinta, ji paskambins serviceChanged () metodas, kaip parodyta 7 sąraše.

Išvardijamas 7. serviceChanged metodas

 public void serviceChanged (ServiceEvent event) {int type = event.getType (); jungiklis (tipas) {atvejis („ServiceEvent.REGISTERED“): serviceReference = event.getServiceReference (); Pasveikinimo paslauga = (Sveikintojas) (ctx.getService (paslauga)); System.out.println ("Pridedant 10 ir 100:" + service.addNum (10, 100)); pertrauka; atvejis (ServiceEvent.UNREGISTERING): System.out.println ("Paslauga neregistruota."); ctx.ungetService (event.getServiceReference ()); // Išleidžia nuorodą į paslaugą, kad ją būtų galima nutraukti; numatytasis: pertrauka; }} 

Atkreipkite dėmesį, kad paslaugaPakeista metodas naudojamas nustatyti, koks įvykis įvyko mus dominančioje paslaugoje. Tada tarnyba atsakys, kaip nurodyta. Šiuo atveju, kai REGISTRUOTAS įvykis, mes naudojame addNum () metodas.

OSGi alternatyva

Tai buvo greitas „Open Services Gateway Initiative“ pristatymas į OSGi. Kaip matėte per „Knoplerfish“ pavyzdį, „OSGi“ pateikia vykdymo laiko aplinką, kurioje galite apibrėžti modulinius „Java“ komponentus (paketus). Tai suteikia apibrėžtą paketų prieglobos klientui gyvavimo ciklą ir palaiko paketus, sąveikaujančius kaip klientus ir konteinerio paslaugas. Visos šios galimybės kartu suteikia įdomią alternatyvą standartiniams „Java“ vykdymo laikams ir sistemoms, ypač mobiliesiems ir daiktų interneto programoms.

Galiausiai atkreipkite dėmesį, kad ankstesniame „Kas yra: Java“ serijos straipsnyje pristatyta „Java Platform Module System“, kuri siūlo kitokį požiūrį į tą patį „Java“ moduliškumo iššūkį.

Šią istoriją „Kas yra OSGi? Kitoks požiūris į„ Java “moduliškumą“ iš pradžių paskelbė „JavaWorld“.

$config[zx-auto] not found$config[zx-overlay] not found