Ohjelmointi

Mikä on OSGi? Eri lähestymistapa Java-modulaarisuuteen

OSGi helpottaa modulaaristen Java-komponenttien (kutsutaan) luomista ja hallintaa niput), jotka voidaan sijoittaa konttiin. Kehittäjänä luot OSGi-määrityksen ja työkalut yhden tai useamman nipun luomiseen. OSGi määrittelee näiden nippujen elinkaaren. Se myös isännöi heitä ja tukee heidän vuorovaikutustaan ​​kontissa. Voit ajatella, että OSGi-säiliö on suunnilleen analoginen JVM: n kanssa, lisävoimilla. Ajattele myös paketteja Java-sovelluksina, joilla on ainutlaatuiset kyvyt. Niput toimivat OSGi-säilön sisällä asiakas- ja palvelinkomponenteina.

OSGi-liittouma

OSGi alkoi vuonna 1999, ja toisin kuin monet muut tekniset tiedot, standardia ei hallinnoi Oracle, Java Community Process tai Eclipse Foundation. Sen sijaan sitä hallinnoi OSGi-allianssi.

Kuinka OSGi on erilainen

OSGin filosofia eroaa muiden Java-pohjaisten kehysten, etenkin Springin, filosofiasta. OSGi: ssä voi olla useita sovelluksia samassa säilössä: OSGi-paketin ajonaikainen ympäristö. Säiliö varmistaa, että jokainen komponentti on riittävän eristetty, ja sillä on myös pääsy kaikkiin tarvitsemiinsa riippuvuuksiin. OSGi tukee Aries Blueprint -projektin standardoimaa riippuvuusinjektiota. Sen lisäksi, että Aries tarjoaa OSGi: n inversio ohjausobjektin (IoC) -säiliön, Aries tukee tavallisia Java-kehyksiä, kuten Java Persistence API (JPA).

OSGissä niput voivat paljastaa palveluja, joita muut niput käyttävät. Nippu voi myös ilmoittaa version ja määrittää, mistä muista nippuista se riippuu. Ajonaika lataa sitten kaikki niput automaattisesti riippuvuusjärjestyksessä. OSGissä saman paketin useita versioita voi olla rinnakkain, jos pakettiriippuvuudet sitä edellyttävät.

OSGi Eclipse IDE: ssä ja Equinoxissa

OSGi on ollut jossain muodossa pari vuosikymmentä. Sitä käytetään monissa tunnetuissa sovelluksissa, upotetuista mobiililaitteista sovelluspalvelimiin ja IDE: iin.

Suosittu Eclipse IDE on rakennettu OSGin päälle. Eclipsen OSGi-kontin toteuttamista kutsutaan Equinoxiksi. Se on hieno esimerkki OSGin ymmärtämisestä. OSGi-pohjainen tarkoittaa, että Equinox on modulaarinen alusta. Se isännöi erilaisia ​​palveluja, joita kehittäjät voivat lisätä halunsa mukaan. Jokainen näistä tarjoaa kyvyn, jota kehittäjä saattaa tarvita IDE: ssä. Voit lisätä Java- ja JavaScript-editorit, sovelluspalvelimen ja tietokantaliittimen. Jokainen näistä on toteutettu OSGi-pakettina, joka lisätään säilöön ja voi olla vuorovaikutuksessa muiden säilössä olevien palveluiden kanssa.

Viime aikoina OSGi: n käyttö esineiden internetissä on ollut kiinnostunut. OSGi sopii luonnollisesti tämäntyyppiseen kehitykseen, jossa on useita ohjelmistokomponentteja, jotka kulkevat rinnakkain laitteissa, tietämättä toisistaan. OSGi-kontti tarjoaa yksinkertaisen ja standardoidun tavan isännöidä näitä dynaamisia ohjelmistokomponentteja.

OSGin käyttö Java-projektissa: Knoplerfish OSGi

Työskentelemme esimerkkisovelluksen avulla, joka tekee OSGi-käsitteistä konkreettisempia. Esimerkkimme perustuu Knoplerfish OSGi -ajoon, jota käytetään monissa tuotantoympäristöissä. Knoplerfish sisältää käyttöliittymän ja komentoriviliittymän (CLI) OSGi-kontin ja sen nippujen hallintaan.

Ensimmäinen asia, jonka teet, on ladata Knoplerfish. Tämänhetkinen versio kirjoitushetkellä on Knoplerfish OSGi 6.1.3. Voit korvata kyseisen version kaikilla uusimmilla, kun luet tätä artikkelia.

Kun olet ladannut ja asentanut Knoplerfishin, pudota CLI: llä hakemistoon, johon latasit JAR-tiedoston, ja kirjoita: java -jar framework.jar. Se suorittaa suoritettavan JAR: n, ja sinua tulisi tervehtiä GUI-ikkunalla.

Knoplerfish OSGi -käyttöliittymä

Knoplerfish OSGin käyttöliittymä voi aluksi tuntua ylivoimaiselta, mutta perusasiat ovat yksinkertaiset:

  • Ruudun yläosassa on valikko.
  • Vasemmalla on joukko nippuja, jotka on ladattu ajonaikaan.
  • Oikealla on tietoikkuna.
  • Alareunassa on tekstinsyöttökonsoli.
  • Alaosassa on tulokonsoli.
Matthew Tyson

Tyyppi auta tulokonsoliin, jos haluat nähdä ohjevaihtoehdot.

Ennen kuin siirrymme esimerkkiin, tutustu käynnissä olevien nippujen sarjaan. Näet paketin nimeltä HTTP-palvelin, mikä tarkoittaa, että HTTP-palvelinta käyttävä nippu on päällä. Siirry selaimeesi ja tarkista // localhost: 8080. Tosiaan, näet Knoplerfish-verkkosivun.

Hello JavaWorld -paketti

Rakennetaan OSGi-ajonaikana yksinkertainen paketti, jota kutsun Hei JavaWorld. Tämä paketti lähettää viestin konsolille.

Luettelossa 1 käytämme nippua Mavenin avulla. Sillä on vain yksi riippuvuus, jonka tarjoaa OSGi-liittouma.

Luettelo 1. OSGi-riippuvuus Maven POM: ssa

   org.osgi org.osgi.core 

Aiomme nyt käyttää myös laajennusta Apache Felix -projektin avulla. Tämä laajennus huolehtii sovelluksen pakkaamisesta OSGi-nipuksi käytettäväksi. Listaus 2 näyttää käytetyn kokoonpanon.

Luettelo 2. OSGi Felix -laajennus Maven POM: ssa

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

Nyt voimme tarkastella yksinkertaista luokkaa, joka tuottaa "Hello".

Listaus 3. Hei JavaWorld OSGi -paketti

 paketti com.javaworld.osgi; tuo org.osgi.framework.BundleActivator; tuo org.osgi.framework.BundleContext; public class HelloJavaWorld toteuttaa BundleActivator {public void start (BundleContext ctx) {System.out.println ("Hello JavaWorld."); } public void stop (BundleContext bundleContext) {}} 

Rakenna paketti siirtymällä komentoriville ja kirjoittamalla mvn puhdas asennus. Tämä tuottaa JAR-tiedoston, joka sisältää paketin. Mene nyt Tiedosto valikko Knoplerfish-käyttöliittymässä ja valitse Lisää paketti. Tämä tarjoaa tiedostoselaimen. Etsi juuri rakentama JAR ja valitse se.

OSGi-pakettien hallinta säilössä

Knoplerfish-käyttöliittymän lähtöikkunassa näet "Hello, JavaWorld" -viestisi. Napsauta nippua Knoplerfish-käyttöliittymässä ja näet sen tunnisteen, jonka säilö on sille määrittänyt. Kun olet valmis pysäyttämään paketin, voit napsauttaa Pysäytä-valikkokohtaa. Toinen tapa on päästä sisään lopeta [nipun numero] komentorivillä. Voit hallita paketteja säiliössä joko käyttöliittymän tai komentorivin avulla.

Nyt sinulla on käsitys siitä, kuinka yksinkertainen paketti toimii OSGi-kontissa. Missä tahansa OSGi-kontissa on, löydät saman yksinkertaisuuden nippujen käynnistämisessä ja lopettamisessa. OSGi luo ympäristön ja elinkaaren paketille.

Bundle Interactions: Palvelut ja asiakkaat

Seuraavaksi tarkastelemme, kuinka niput kommunikoivat keskenään.

Ensimmäinen asia, jonka teemme, on luoda palvelupaketti. Palvelupaketti on analoginen EJB-istuntoobean kanssa: Se tarjoaa komponentin, johon muut niput voivat päästä etärajapinnan kautta. Palvelupaketin luomiseksi meidän on annettava sekä käyttöliittymä että toteutusluokka.

Luettelo 4. Palvelupaketin käyttöliittymä

 paketti com.javaworld.osgi.service; julkinen käyttöliittymä WhatIsOsgi {public Integer addNum (kokonaisluku x, kokonaisluku y); } 

Listaus 4 on yksinkertainen käyttöliittymä. Ainoa menetelmä on a addNum () menetelmä, joka tekee mitä tarkoittaa: palauttaa kahden numeron lisäämisen. Listauksessa 5 esitetty toteutus on yhtä yksinkertainen, mutta lisää muutaman OSGi-spesifisen menetelmän.

Listaus 5. Palvelupaketin toteutus

 paketti com.javaworld.osgi.service; julkinen luokka WhatIsOsgiImpl toteuttaa WhatIsOsgi, BundleActivator {private ServiceReference ref; yksityinen ServiceRegistration-rekisteri; @Override public Integer addNum (kokonaisluku x, kokonaisluku y) {return x + y; } @Override public void start (BundleContext context) heittää Exception {reg = context.registerService (WhatIsOsgi.class, new WhatIsOsgiImpl (), new Hashtable ()); viite = reg.getReference (); } @Override public void stop (BundleContext context) heittää poikkeuksen {reg.unregister (); }} 

Katsotaanpa tarkemmin, mitä listalla 5 tapahtuu:

  1. julkinen luokka WhatIsOsgiImpl toteuttaa WhatIsOsgi, BundleActivator: Tässä toteutamme luomamme käyttöliittymän. Huomaa, että toteutamme myös BundleActivator käyttöliittymä, kuten teimme HeiJavaWorld esimerkki. Jälkimmäinen johtuu siitä, että tämä paketti aktivoituu itsestään.
  2. yksityinen ServiceReference ref; yksityinen ServiceRegistration-rekisteri;: Nämä ovat muuttujia OSGi-rekisteröintipalvelulle ja tämän palvelun nippuviittaukseksi.
  3. public Integer addNum (kokonaisluku x, kokonaisluku y): Tämä on add-menetelmän yksinkertainen toteutus.
  4. public void start (BundleContext-konteksti): Tämä aloitusmenetelmä on osa BundleActivator käyttöliittymä, ja sen suorittaa säiliö. Tässä esimerkissä saamme viitteen OSGi-rekisteröintipalveluun ja sovellamme sitä omaan MitäIsOsgi käyttöliittymä ja toteutus. Tyhjä Hashtable on konfigurointiparameille, joita emme käytä tässä. Saamme myös viittauksen juuri luomaamme palveluun.
  5. public void stop (BundleContext-konteksti): Tässä me yksinkertaisesti peruutamme palvelun rekisteröinnin. Tämä yksinkertainen palvelu hallitsee vain sen elinkaaren kaikkein vaikeimpia osia. Sen päätarkoitus on paljastaa addNum menetelmä OSGi-säiliöön.

OSGi-asiakas

Seuraavaksi kirjoitetaan asiakas, joka voi käyttää palvelua. Tämä asiakas käyttää uudelleen BundleActivator käyttöliittymä. Se lisää myös ServiceListener käyttöliittymä, kuten luettelossa 6 on esitetty.

Listaus 6. OSGi-palvelun asiakaspaketti

 julkinen luokka OsgiClient toteuttaa BundleActivator, ServiceListener {private BundleContext ctx; yksityinen ServiceReference-palvelu; public void start (BundleContext ctx) {this.ctx = ctx; kokeile {ctx.addServiceListener (tämä, "(objectclass =" + WhatIsOsgi.class.getName () + ")"); } catch (InvalidSyntaxException ise) {ise.printStackTrace (); }}} 

Listalla 6 on aloitusmenetelmä, joka lisää palvelun kuuntelijan. Tämä kuuntelija suodatetaan luettelossa 5 luomamme palvelun luokan nimen perusteella. Kun palvelu päivitetään, se soittaa serviceChanged () menetelmä, kuten luettelossa 7 on esitetty.

Listaus 7. serviceChanged-menetelmä

 public void serviceChanged (ServiceEvent event) {int type = event.getType (); kytkin (tyyppi) {tapaus (ServiceEvent.REGISTERED): serviceReference = event.getServiceReference (); Tervehdyspalvelu = (Tervehdys) (ctx.getService (palvelu)); System.out.println ("Lisätään 10 ja 100:" + service.addNum (10, 100)); tauko; tapaus (ServiceEvent.UNREGISTERING): System.out.println ("Palvelua ei ole rekisteröity."); ctx.ungetService (event.getServiceReference ()); // Julkaisee viittauksen palveluun, jotta se voi olla GC'd break; oletus: tauko; }} 

Huomaa, että serviceChanged menetelmää käytetään määrittämään, mikä tapahtuma on tapahtunut kiinnostavalle palvelulle. Palvelu vastaa sitten määritetyllä tavalla. Tässä tapauksessa, kun Rekisteröitynyt tapahtuma ilmestyy, käytämme addNum () menetelmä.

OSGi-vaihtoehto

Tämä on ollut nopea esittely OSGiin, Open Services Gateway Initiative -ohjelmaan. Kuten olet nähnyt Knoplerfish-esimerkin kautta, OSGi tarjoaa ajonaikaisen ympäristön, jossa voit määrittää modulaariset Java-komponentit (niput). Se tarjoaa määritetyn elinkaaren nippujen isännöimiseksi asiakkaassa ja tukee nippuja, jotka ovat vuorovaikutuksessa asiakkaina ja palveluina säilössä. Kaikki nämä ominaisuudet yhdessä tarjoavat mielenkiintoisen vaihtoehdon tavallisille Java-ajoille ja kehyksille, erityisesti mobiili- ja IoT-sovelluksille.

Lopuksi on huomattava, että "Mikä on: Java" -sarjan edellinen artikkeli esitteli Java Platform Module System -järjestelmän, joka tarjoaa erilaisen lähestymistavan samaan Java-modulaarisuuden haasteeseen.

Tämän tarinan "Mikä on OSGi? Eri lähestymistapa Java-modulaarisuuteen" julkaisi alun perin JavaWorld.