Programiranje

Kaj je OSGi? Drugačen pristop k modularnosti Java

OSGi olajša ustvarjanje in upravljanje modularnih komponent Java (imenovano snopi), ki jih je mogoče razporediti v vsebnik. Kot razvijalec uporabljate specifikacijo OSGi in orodja za ustvarjanje enega ali več snopov. OSGi določa življenjski cikel teh paketov. Prav tako jih gosti in podpira njihovo interakcijo v vsebniku. Zabojnik OSGi si lahko predstavljate približno podoben JVM z dodatnimi pooblastili. Podobno mislite na svežnje kot na programe Java z edinstvenimi sposobnostmi. Paketi se izvajajo znotraj vsebnika OSGi kot odjemalske in strežniške komponente.

Zavezništvo OSGi

OSGi se je začel leta 1999 in v nasprotju s številnimi drugimi specifikacijami standarda ne upravlja Oracle, Java Community Process ali Eclipse Foundation. Namesto tega upravlja zavezništvo OSGi.

Kako drugačen je OSGi

Filozofija OSGi se razlikuje od filozofij drugih sistemov, ki temeljijo na Javi, predvsem Spring. V OSGi lahko v istem vsebniku obstaja več aplikacij: Izvajalno okolje OSGi svežnja. Vsebnik zagotavlja, da je vsaka komponenta dovolj izolirana in ima dostop do vseh odvisnosti, ki jih zahteva. OSGi lahko podpira vbrizgavanje odvisnosti, kar je standardizirano v projektu Aries Blueprint. Poleg zagotavljanja vsebnika za inverzijo nadzora (IoC) OSGi, Aries podpira standardne okvire Java, kot je Java Persistence API (JPA).

V OSGi lahko svežnji izpostavijo storitve, ki jih uporabljajo drugi svežnji. Snop lahko razglasi tudi različico in lahko opredeli, od katerih drugih svežnjev je odvisen. Izvajalno okolje bo nato samodejno naložil vse svoje svežnje po vrstnem redu odvisnosti. V OSGi lahko obstaja več različic istega svežnja vzporedno, če to zahtevajo odvisnosti svežnja.

OSGi v Eclipse IDE in Equinox

OSGi obstaja v neki obliki že nekaj desetletij. Uporablja se za številne znane aplikacije, od vdelanih mobilnih naprav do aplikacijskih strežnikov in IDE-jev.

Priljubljeni Eclipse IDE je zgrajen na vrhu OSGi. Eclipseova izvedba vsebnika OSGi se imenuje Equinox. Je odličen primer za razumevanje OSGi. Ker temelji na OSGi, pomeni, da je Equinox modularna platforma. Gosti različne storitve, ki jih razvijalci lahko dodajo po želji. Vsak od teh ponuja zmožnosti, ki bi jih razvijalec morda potreboval v svojem IDE. Lahko dodate urejevalnike za Javo in JavaScript, strežnik aplikacij in priključek baze podatkov. Vsak od njih je izveden kot sveženj OSGi, ki je dodan vsebniku in lahko komunicira z drugimi storitvami v vsebniku.

V zadnjem času se je povečalo zanimanje za uporabo OSGi za internet stvari (IoT). OSGi je povsem primeren za tovrstni razvoj, saj ima različne programske komponente, ki se na napravah izvajajo vzporedno, ne da bi nujno vedeli drug za drugega. Vsebnik OSGi ponuja preprost in standardiziran način za gostovanje teh dinamičnih komponent programske opreme.

Uporaba OSGi v projektu Java: Knoplerfish OSGi

Delali bomo na primeru aplikacije, ki bo koncepte OSGi naredila bolj konkretne. Naš primer temelji na izvajalnem okolju Knoplerfish OSGi, ki se uporablja v številnih proizvodnih postavitvah. Knoplerfish vključuje GUI in vmesnik ukazne vrstice (CLI) za upravljanje vsebnika OSGi in njegovih svežnjev.

Prva stvar, ki jo boste storili, je prenos Knoplerfish. Trenutna različica v času pisanja tega članka je Knoplerfish OSGi 6.1.3. Ko preberete ta članek, lahko to različico zamenjate s tisto, ki je najnovejša.

Ko prenesete in namestite Knoplerfish, s pomočjo CLI-ja spustite v imenik, kamor ste prenesli datoteko JAR, in vnesite: java -jar framework.jar. To bo zagnalo izvršljiv JAR in pozdravili bi vas z oknom GUI.

Uporabniški vmesnik OSGi Knoplerfish

Grafični uporabniški vmesnik Knoplerfish OSGi se sprva zdi neverjeten, vendar so osnove preproste:

  • Na vrhu zaslona je meni.
  • Na levi je sklop snopov, ki so bili naloženi v času izvajanja.
  • Na desni je informacijsko okno.
  • Na dnu je konzola za izpis besedila.
  • Čisto na dnu je vhodna konzola.
Matthew Tyson

Tip pomoč v vhodno konzolo, če želite videti možnosti pomoči.

Preden se premaknemo v primer, si oglejte nabor tekočih svežnjev. Videli boste sveženj z imenom HTTP strežnik, kar pomeni, da je svežen paket s strežnikom HTTP. Pojdite v brskalnik in si oglejte // localhost: 8080. Seveda boste videli spletno stran Knoplerfish.

Paket "Hello JavaWorld"

Izkoristimo čas izvajanja OSGi za izdelavo preprostega svežnja, ki ga bom poklical Pozdravljeni JavaWorld. Ta sveženj prikaže sporočilo na konzolo.

V seznamu 1 za izdelavo svežnja uporabljamo Maven. Ima samo eno odvisnost, ki jo zagotavlja zavezništvo OSGi.

Seznam 1. Odvisnost OSGi v Maven POM

   org.osgi org.osgi.core 

Zdaj bomo uporabili tudi vtičnik, zahvaljujoč projektu Apache Felix. Ta vtičnik skrbi za pakiranje aplikacije kot paketa OSGi za uporabo. Seznam 2 prikazuje konfiguracijo, ki jo bomo uporabili.

Seznam 2. Vtičnik OSGi Felix v Maven POM

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

Zdaj si lahko ogledamo preprost razred, ki bo izpisal »Hello«.

Seznam 3. Pozdravljeni paket JavaWorld OSGi

 paket com.javaworld.osgi; uvoz org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; javni razred HelloJavaWorld izvaja BundleActivator {javni void start (BundleContext ctx) {System.out.println ("Hello JavaWorld."); } javna void stop (BundleContext bundleContext) {}} 

Snop zgradite tako, da odprete ukazno vrstico in vnesete mvn čista namestitev. Tako bo prikazana datoteka JAR, ki vsebuje sveženj. Zdaj pa pojdi na mapa v meniju Knoplerfish GUI in izberite Dodaj sveženj. To bo zagotovilo brskalnik datotek. Poiščite JAR, ki smo ga pravkar zgradili, in ga izberite.

Upravljanje paketov OSGi v vsebniku

V izhodnem oknu uporabniškega vmesnika Knoplerfish se prikaže sporočilo »Pozdravljeni, JavaWorld«. Kliknite sveženj v GUI Knoplerfish in videli boste ID, ki mu ga je dodelil vsebnik. Ko ste pripravljeni ustaviti sveženj, lahko kliknete element menija Stop. Drug način je vstop stop [številka svežnja] v ukazni vrstici. Pakete v vsebniku lahko upravljate s pomočjo GUI ali ukazne vrstice.

Zdaj imate občutek, kako preprost sveženj deluje v vsebniku OSGi. Kjerkoli obstaja vsebnik OSGi, boste našli enako preprostost pri zagonu in zaustavitvi snopov. OSGi ustvarja okolje in življenjski cikel svežnja.

Interakcije s svežnji: storitve in stranke

Nato si bomo ogledali, kako svežnji komunicirajo med seboj.

Prva stvar, ki jo bomo storili, je ustvariti paket storitev. Paket storitev je analogen seji EJB: nudi komponento, do katere lahko prek oddaljenega vmesnika dostopajo drugi svežnji. Če želite ustvariti paket storitev, moramo zagotoviti vmesnik in razred izvedbe.

Seznam 4. Vmesnik snopa storitev

 paket com.javaworld.osgi.service; javni vmesnik WhatIsOsgi {javni Integer addNum (Celo število x, Celo število y); } 

Seznam 4 je preprost vmesnik. Edina metoda je addNum () metoda, ki bo storila, kar pomeni: vrne seštevanje dveh števil. Izvedba, prikazana v seznamu 5, je enako preprosta, vendar dodaja nekaj metod, specifičnih za OSGi.

Seznam 5. Izvedba svežnja storitev

 paket com.javaworld.osgi.service; javni razred WhatIsOsgiImpl izvaja WhatIsOsgi, BundleActivator {private ServiceReference ref; zasebna registracija ServiceRegistration; @Override public Integer addNum (Integer x, Integer y) {return x + y; } @Override public void start (BundleContext context) vrže izjemo {reg = context.registerService (WhatIsOsgi.class, new WhatIsOsgiImpl (), new Hashtable ()); ref = reg.getReference (); } @Override public void stop (kontekst BundleContext) vrže izjemo {reg.unregister (); }} 

Poglejmo si podrobneje, kaj se dogaja v seznamu 5:

  1. javni razred WhatIsOsgiImpl izvaja WhatIsOsgi, BundleActivator: Tu izvajamo vmesnik, ki smo ga ustvarili. Upoštevajte, da izvajamo tudi BundleActivator vmesnik, kot smo to storili z HelloJavaWorld primer. Slednje je zato, ker se bo ta sveženj sam aktiviral.
  2. sklic na zasebno ServiceReference; zasebna registracija ServiceRegistration;: To sta spremenljivki za registracijsko storitev OSGi oziroma sklic svežnja za to storitev.
  3. javni Integer addNum (Celo število x, Celo število y): To je preprosta izvedba metode add.
  4. javni void start (kontekst BundleContext): Ta način zagona je del BundleActivator vmesnik, izvaja pa ga vsebnik. V tem primeru dobimo sklic na registracijsko storitev OSGi in jo uporabimo pri naši WhatIsOsgi vmesnik in izvedba. Prazno Hashtable je za konfiguracijske parametre, ki jih tukaj ne uporabljamo. Prav tako dobimo sklic na storitev, ki smo jo pravkar ustvarili.
  5. javni void stop (kontekst BundleContext): Tu preprosto odjavimo storitev. Ta preprosta storitev samo upravlja najnujnejše elemente svojega življenjskega cikla. Njegov glavni namen je razkriti addNum v vsebnik OSGi.

Odjemalec OSGi

Nato napišimo stranko, ki lahko uporablja storitev. Ta odjemalec bo znova uporabil BundleActivator vmesnik. Dodalo bo tudi ServiceListener vmesnik, kot je prikazano v seznamu 6.

Seznam 6. Paket odjemalcev storitev OSGi

 javni razred OsgiClient izvaja BundleActivator, ServiceListener {private BundleContext ctx; zasebna storitev ServiceReference; javni void start (BundleContext ctx) {this.ctx = ctx; poskusite {ctx.addServiceListener (to, "(objectclass =" + WhatIsOsgi.class.getName () + ")"); } catch (InvalidSyntaxException ise) {ise.printStackTrace (); }}} 

Seznam 6 vsebuje način zagona, ki bo dodal poslušalca storitve. Ta poslušalec je filtriran po imenu razreda storitve, ki smo jo ustvarili v seznamu 5. Ko bo storitev posodobljena, bo poklicala serviceChanged () metoda, kot je prikazano v seznamu 7.

Seznam 7. metoda serviceChanged

 public void serviceChanged (dogodek ServiceEvent) {int type = event.getType (); stikalo (vrsta) {case (ServiceEvent.REGISTERED): serviceReference = event.getServiceReference (); Greeter service = (Greeter) (ctx.getService (service)); System.out.println ("Dodajanje 10 in 100:" + service.addNum (10, 100)); odmor; primer (ServiceEvent.UNREGISTERING): System.out.println ("Storitev neregistrirana."); ctx.ungetService (event.getServiceReference ()); // objavi sklic na storitev, da se lahko GC prekine; privzeto: odmor; }} 

Upoštevajte, da serviceChanged metoda se uporablja za določitev, kateri dogodek se je zgodil za storitev, ki nas zanima. Storitev se bo nato odzvala, kot je določeno. V tem primeru, ko REGISTRIRANO dogodek, uporabimo addNum () metoda.

Alternativa OSGi

To je bil hiter uvod v OSGi, pobudo Open Services Gateway. Kot ste videli skozi primer Knoplerfish, OSGi ponuja izvajalno okolje, v katerem lahko definirate modularne komponente Java (svežnji). Zagotavlja definiran življenjski cikel za gostovanje paketov v odjemalcu in podpira svežnje, ki medsebojno delujejo kot odjemalci in storitve v vsebniku. Vse te zmožnosti skupaj ponujajo zanimivo alternativo standardnim Java izvajalnim okoljem in ogrodjem, zlasti za mobilne in IoT aplikacije.

Na koncu še omenimo, da je prejšnji članek v seriji »Kaj je: Java« predstavil sistem modulov Java Platform, ki ponuja drugačen pristop k istemu izzivu modularnosti Java.

To zgodbo "Kaj je OSGi? Drugačen pristop k modularnosti Java" je prvotno objavil JavaWorld.

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