Programovanie

Čo je OSGi? Odlišný prístup k modularite Java

OSGi uľahčuje vytváranie a správu modulárnych komponentov Java (tzv zväzky), ktoré je možné umiestniť v kontajneri. Ako vývojár používate špecifikáciu a nástroje OSGi na vytvorenie jedného alebo viacerých zväzkov. OSGi definuje životný cyklus týchto zväzkov. Tiež ich hostí a podporuje ich interakcie v kontajneri. Môžete si predstaviť kontajner OSGi ako zhruba analogický s JVM s ďalšími právomocami. Rovnako si pod zväzkami predstavte aplikácie Java s jedinečnými schopnosťami. Balíky bežia vo vnútri kontajnera OSGi ako komponenty klienta a servera.

Aliancia OSGi

OSGi sa začalo v roku 1999 a na rozdiel od mnohých ďalších špecifikácií tento štandard nespravuje spoločnosť Oracle, proces Java Community Process alebo Eclipse Foundation. Namiesto toho ju spravuje aliancia OSGi.

V čom je OSGi iný

Filozofia OSGi sa líši od filozofie iných rámcov založených na prostredí Java, najmä na jar. V OSGi môže v jednom kontajneri existovať viac aplikácií: Runtime prostredie balíka OSGi. Kontajner zaisťuje, aby bol každý komponent dostatočne izolovaný, a tiež má prístup k všetkým závislostiam, ktoré vyžaduje. OSGi môže podporovať vkladanie závislostí, ktoré je štandardizované projektom Aries Blueprint. Okrem poskytovania kontajnera na inverziu riadenia OSGi (IoC) podporuje Aries štandardné rámce Java, ako je Java Persistence API (JPA).

V OSGi môžu zväzky vystaviť služby, ktoré používajú iné zväzky. Balík môže tiež deklarovať verziu a môže definovať, na ktorých ďalších balíkoch to závisí. Modul runtime potom automaticky načíta všetky jeho zväzky v poradí podľa závislosti. V OSGi môže vedľa seba existovať viac verzií toho istého zväzku, ak to závislosť zväzku vyžaduje.

OSGi v Eclipse IDE a Equinox

OSGi existuje v nejakej podobe už pár desaťročí. Používa sa pre mnoho známych aplikácií, od zabudovaných mobilných zariadení až po aplikačné servery a IDE.

Populárne Eclipse IDE je postavené na OSGi. Implementácia kontajnera OSGi spoločnosťou Eclipse sa nazýva Equinox. Je to skvelý príklad na pochopenie OSGi. Byť založený na OSGi znamená, že Equinox je modulárna platforma. Je hostiteľom rôznych služieb, ktoré môžu vývojári ľubovoľne pridávať. Každá z nich ponúka možnosti, ktoré môže vývojár vo svojom IDE potrebovať. Môžete pridať editory pre Java a JavaScript, aplikačný server a databázový konektor. Každý z nich je implementovaný ako balík OSGi, ktorý sa pridáva do kontajnera a môže interagovať s ostatnými službami v kontajneri.

V poslednej dobe vzrástol záujem o používanie OSGi pre internet vecí (IoT). OSGi je prirodzeným riešením pre tento typ vývoja, ktorý má rôzne softvérové ​​komponenty bežiace vedľa seba na zariadeniach bez toho, aby o sebe nevyhnutne vedeli. Kontajner OSGi poskytuje jednoduchý a štandardizovaný spôsob hostenia týchto dynamických softvérových komponentov.

Používanie OSGi v projekte Java: Knoplerfish OSGi

Vypracujeme príklad aplikácie, ktorá urobí koncepty OSGi konkrétnejšími. Náš príklad je založený na runtime Knoplerfish OSGi, ktorý sa používa v mnohých produkčných nasadeniach. Knoplerfish obsahuje GUI a rozhranie príkazového riadku (CLI) na správu kontajnera OSGi a jeho balíkov.

Prvá vec, ktorú urobíte, je stiahnutie Knoplerfish. Aktuálna verzia v čase písania tohto článku je Knoplerfish OSGi 6.1.3. Pri čítaní tohto článku môžete túto verziu nahradiť čímkoľvek najaktuálnejším.

Po stiahnutí a nainštalovaní Knoplerfish pomocou CLI prejdite do adresára, do ktorého ste stiahli súbor JAR, a zadajte: java -jar framework.jar. Spustí sa spustiteľný súbor JAR a mali by ste byť privítaní oknom GUI.

GUI Knoplerfish OSGi

Grafické používateľské rozhranie Knoplerfish OSGi sa na začiatku môže zdať ohromujúce, ale základy sú jednoduché:

  • V hornej časti obrazovky je ponuka.
  • Naľavo je sada zväzkov, ktoré boli načítané do modulu runtime.
  • Napravo je informačné okno.
  • V dolnej časti je konzola pre textový výstup.
  • Úplne dole je vstupná konzola.
Matthew Tyson

Typ Pomoc do vstupnej konzoly, ak chcete zobraziť možnosti pomoci.

Predtým, ako sa presunieme k príkladu, pozrite sa na množinu spustených balíkov. Uvidíte balík s názvom HTTP server, čo znamená, že je spustený balík, na ktorom je spustený server HTTP. Prejdite do prehliadača a vyskúšajte // localhost: 8080. Určite uvidíte webovú stránku Knoplerfish.

Balík „Hello JavaWorld“

Využime runtime OSGi na zostavenie jednoduchého balíka, ktorý budem nazývať Ahoj JavaWorld. Tento balík odošle správu do konzoly.

V zozname 1 používame na zostavenie balíka program Maven. Má iba jednu závislosť, ktorú poskytuje aliancia OSGi.

Zoznam 1. Závislosť OSGi v Maven POM

   org.osgi org.osgi.core 

Teraz tiež použijeme doplnok, s povolením projektu Apache Felix. Tento doplnok sa stará o zabalenie aplikácie ako balíka OSGi na použitie. Výpis 2 zobrazuje konfiguráciu, ktorú použijeme.

Zoznam 2. Doplnok OSGi Felix v Maven POM

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

Teraz sa môžeme pozrieť na jednoduchú triedu, ktorá bude mať výstup „Hello“.

Zoznam 3. Dobrý deň, balík JavaWorld OSGi

 balíček com.javaworld.osgi; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; verejná trieda HelloJavaWorld implementuje BundleActivator {public void start (BundleContext ctx) {System.out.println ("Hello JavaWorld."); } verejné zastavenie neplatnosti (BundleContext bundleContext) {}} 

Vytvorte balík tak, že prejdete na príkazový riadok a napíšete mvn čistá inštalácia. Týmto sa vygeneruje súbor JAR obsahujúci zväzok. Teraz choďte na Súbor ponuky v grafickom používateľskom rozhraní Knoplerfish a vyberte Pridať balík. Takto získate prehľadávač súborov. Nájdite súbor JAR, ktorý sme práve vytvorili, a vyberte ho.

Správa balíkov OSGi v kontajneri

Vo výstupnom okne používateľského rozhrania Knoplerfish uvidíte svoju správu „Hello, JavaWorld“. Kliknite na zväzok v grafickom používateľskom rozhraní Knoplerfish a uvidíte ID, ktoré mu kontajner priradil. Keď ste pripravení balík zastaviť, môžete kliknúť na položku ponuky Zastaviť. Ďalším spôsobom je vstup zastávka [číslo balíka] na príkazovom riadku. Balíky v kontajneri môžete spravovať pomocou grafického používateľského rozhrania alebo príkazového riadku.

Teraz máte predstavu o tom, ako funguje jednoduchý zväzok v kontajneri OSGi. Všade, kde existuje kontajner OSGi, nájdete rovnakú jednoduchosť pri spúšťaní a zastavovaní balíkov. OSGi vytvára pre balík prostredie a životný cyklus.

Interakcie zväzkov: služby a klienti

Ďalej sa pozrieme na to, ako balíky navzájom komunikujú.

Prvá vec, ktorú urobíme, je vytvoriť balík služieb. Balík služieb je analogický k fazule relácie EJB: Poskytuje komponent, ku ktorému je možné pristupovať z iných balíkov prostredníctvom vzdialeného rozhrania. Na vytvorenie balíka služieb musíme poskytnúť rozhranie aj implementačnú triedu.

Výpis 4. Rozhranie balíka služieb

 balíček com.javaworld.osgi.service; verejné rozhranie WhatIsOsgi {public Integer addNum (Integer x, Integer y); } 

Výpis 4 je jednoduché rozhranie. Jedinou metódou je a addNum () metóda, ktorá urobí to, čo znamená: vráti sčítanie dvoch čísel. Implementácia uvedená v zozname 5 je rovnako jednoduchá, ale pridáva niekoľko metód špecifických pre OSGi.

Zoznam 5. Implementácia balíka služieb

 balíček com.javaworld.osgi.service; verejná trieda WhatIsOsgiImpl implementuje WhatIsOsgi, BundleActivator {private ServiceReference ref; private ServiceRegistration reg; @ Override public Integer addNum (Integer x, Integer y) {return x + y; } @Override public void start (kontext BundleContext) vyvolá výnimku {reg = context.registerService (WhatIsOsgi.class, new WhatIsOsgiImpl (), new Hashtable ()); ref = reg.getReference (); } @Override public void stop (kontext BundleContext) vyvolá výnimku {reg.unregister (); }} 

Pozrime sa bližšie na to, čo sa deje v zozname 5:

  1. verejná trieda WhatIsOsgiImpl implementuje WhatIsOsgi, BundleActivator: Tu implementujeme rozhranie, ktoré sme vytvorili. Upozorňujeme, že implementujeme aj BundleActivator rozhranie, ako sme to urobili s HelloJavaWorld príklad. Druhá možnosť je, pretože tento balík sa sám aktivuje.
  2. private ServiceReference ref; private ServiceRegistration reg;: Toto sú premenné pre službu registrácie OSGi a referenciu zväzku pre túto službu.
  3. verejné celé číslo addNum (celé číslo x, celé číslo y): Toto je jednoduchá implementácia metódy pridania.
  4. public void start (kontext BundleContext): Táto štartovacia metóda je súčasťou BundleActivator rozhranie a vykonáva ho kontajner. V tomto príklade získame odkaz na službu registrácie OSGi a použijeme ju na našu WhatIsOsgi rozhranie a implementácia. Prázdne Hashtable je pre konfiguračné parametre, ktoré tu nepoužívame. Dostaneme tiež odkaz na službu, ktorú sme práve vytvorili.
  5. zastavenie verejnej neplatnosti (kontext BundleContext): Tu jednoducho zrušíme registráciu služby. Táto jednoduchá služba spravuje iba tie najdôležitejšie prvky jej životného cyklu. Jeho hlavným účelom je odhaliť addNum metóda do kontajnera OSGi.

Klient OSGi

Ďalej napíšeme klienta, ktorý môže službu využívať. Tento klient opäť využije BundleActivator rozhranie. Pridá tiež ServiceListener ako je uvedené v zozname 6.

Zoznam 6. Balík klientov služby OSGi

 verejná trieda OsgiClient implementuje BundleActivator, ServiceListener {private BundleContext ctx; súkromná služba Referenčná služba; public void start (BundleContext ctx) {this.ctx = ctx; try {ctx.addServiceListener (this, "(objectclass =" + WhatIsOsgi.class.getName () + ")"); } catch (InvalidSyntaxException ise) {ise.printStackTrace (); }}} 

Výpis 6 má metódu spustenia, ktorá pridá poslucháča služieb. Tento poslucháč je filtrovaný podľa názvu triedy služby, ktorú sme vytvorili v zozname 5. Keď je služba aktualizovaná, zavolá serviceChanged () spôsobom uvedeným v zozname 7.

Výpis 7. službaZmenená metóda

 public void serviceChanged (udalosť ServiceEvent) {int type = event.getType (); switch (type) {case (ServiceEvent.REGISTERED): serviceReference = event.getServiceReference (); Greeter service = (Greeter) (ctx.getService (služba)); System.out.println ("Pridanie 10 a 100:" + service.addNum (10, 100)); prestávka; prípad (ServiceEvent.UNREGISTERING): System.out.println ("Služba bola neregistrovaná."); ctx.ungetService (event.getServiceReference ()); // Vydáva odkaz na službu, aby mohla byť prerušená GC'd; predvolené: break; }} 

Všimnite si, že serviceChanged pomocou metódy sa určuje, ktorá udalosť nastala pre službu, o ktorú sa zaujímame. Služba potom odpovie podľa zadania. V takom prípade, keď REGISTROVANÝ udalosť sa objaví, využívame addNum () metóda.

Alternatíva OSGi

Toto bol rýchly úvod do OSGi, iniciatívy Open Services Gateway Initiative. Ako ste videli na príklade Knoplerfish, OSGi poskytuje runtime prostredie, v ktorom môžete definovať modulárne komponenty Java (zväzky). Poskytuje definovaný životný cyklus pre hosťovanie balíkov v klientovi a podporuje interakciu balíkov ako klientov a služieb v kontajneri. Všetky tieto schopnosti dokopy poskytujú zaujímavú alternatívu k štandardným runtime a rámcom Java, najmä pre mobilné aplikácie a IoT.

Na záver si všimnite, že predchádzajúci článok v sérii „Čo je: Java“ predstavil systém Java Platform Module System, ktorý ponúka odlišný prístup k rovnakej výzve modularity Java.

Tento príbeh „Čo je OSGi? Iný prístup k modularite Java“ pôvodne publikoval server JavaWorld.

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