Programování

Co je OSGi? Jiný přístup k modularitě Javy

OSGi usnadňuje vytváření a správu modulárních komponent Java (tzv svazky), které lze nasadit do kontejneru. Jako vývojář používáte specifikaci a nástroje OSGi k vytvoření jednoho nebo více svazků. OSGi definuje životní cyklus těchto balíčků. Také je hostitelem a podporuje jejich interakce v kontejneru. Kontejner OSGi můžete považovat za zhruba analogický s JVM s dalšími schopnostmi. Podobně si představte balíčky jako aplikace Java s jedinečnými schopnostmi. Balíčky běží uvnitř kontejneru OSGi jako komponenty klienta a serveru.

Aliance OSGi

OSGi začalo v roce 1999 a na rozdíl od mnoha jiných specifikací standard není spravován společností Oracle, procesem Java Community Process nebo Eclipse Foundation. Místo toho je spravována aliancí OSGi.

Jak je OSGi jiný

Filozofie OSGi se liší od filozofie jiných rámců založených na Javě, zejména Spring. V OSGi může ve stejném kontejneru existovat více aplikací: Běhové prostředí balíku OSGi. Kontejner zajišťuje, že každá součást je dostatečně izolovaná a má také přístup ke všem závislostem, které vyžaduje. OSGi může podporovat vkládání závislostí, které je standardizováno projektem Aries Blueprint. Kromě poskytování kontejneru inverze řízení OSGi (IoC) podporuje Aries standardní rámce Java, jako je Java Persistence API (JPA).

V OSGi mohou balíčky vystavovat služby, které používají jiné balíčky. Balíček může také deklarovat verzi a může definovat, na kterých dalších balíčcích záleží. Modul runtime poté automaticky načte všechny jeho svazky v pořadí podle závislosti. V OSGi může vedle sebe existovat více verzí stejného balíčku, pokud to vyžadují závislosti balíku.

OSGi v Eclipse IDE a Equinox

OSGi existuje v nějaké formě už několik desetiletí. Používá se pro mnoho známých aplikací, od vestavěných mobilních zařízení po aplikační servery a IDE.

Populární IDE Eclipse je postaveno na OSGi. Implementace kontejneru OSGi Eclipse se nazývá Equinox. Je to skvělý příklad pro pochopení OSGi. Být založen na OSGi znamená, že Equinox je modulární platforma. Hostuje řadu služeb, které mohou vývojáři libovolně přidat. Každá z nich nabízí funkce, které může vývojář ve svém IDE potřebovat. Můžete přidat editory pro Java a JavaScript, aplikační server a databázový konektor. Každý z nich je implementován jako balíček OSGi, který je přidán do kontejneru a může komunikovat s dalšími službami v kontejneru.

V poslední době vzrostl zájem o používání OSGi pro internet věcí (IoT). OSGi je přirozeně vhodný pro tento typ vývoje, který má celou řadu softwarových komponent běžících vedle sebe na zařízeních, aniž by o sobě nutně věděl. Kontejner OSGi poskytuje jednoduchý a standardizovaný způsob hostování těchto dynamických softwarových komponent.

Používání OSGi v projektu Java: Knoplerfish OSGi

Projdeme si příklad aplikace, která zpřesní koncepty OSGi. Náš příklad je založen na běhovém prostředí Knoplerfish OSGi, které se používá v mnoha produkčních nasazeních. Knoplerfish obsahuje grafické uživatelské rozhraní a rozhraní příkazového řádku (CLI) pro správu kontejneru OSGi a jeho svazků.

První věc, kterou uděláte, je stáhnout si Knoplerfish. Aktuální verze v době psaní tohoto článku je Knoplerfish OSGi 6.1.3. Při čtení tohoto článku můžete tuto verzi nahradit jakoukoli nejnovější.

Po stažení a instalaci Knoplerfish přejděte pomocí rozhraní příkazového řádku do adresáře, do kterého jste stáhli soubor JAR, a zadejte: java -jar framework.jar. Spustí se spustitelný soubor JAR a měli byste být uvítáni oknem GUI.

GUI Knoplerfish OSGi

GUI Knoplerfish OSGi se zpočátku může zdát ohromující, ale základy jsou jednoduché:

  • V horní části obrazovky je nabídka.
  • Nalevo je sada svazků, které byly načteny do modulu runtime.
  • Napravo je informační okno.
  • Ve spodní části je textová výstupní konzola.
  • Úplně dole je vstupní konzole.
Matthew Tyson

Typ Pomoc chcete-li zobrazit možnosti nápovědy, do vstupní konzoly.

Než se přesuneme do příkladu, podívejme se na sadu běžících balíčků. Uvidíte balíček s názvem HTTP server, což znamená, že je spuštěn balíček se spuštěným serverem HTTP. Přejděte do svého prohlížeče a podívejte se na // localhost: 8080. Určitě uvidíte webovou stránku Knoplerfish.

Balíček „Hello JavaWorld“

Využijme runtime OSGi k vytvoření jednoduchého balíčku, kterému budu říkat Ahoj JavaWorld. Tento balíček odešle zprávu do konzoly.

V seznamu 1 používáme Maven k sestavení balíčku. Má pouze jednu závislost, kterou poskytuje aliance OSGi.

Výpis 1. Závislost OSGi v Maven POM

   org.osgi org.osgi.core 

Nyní také použijeme zásuvný modul, s laskavým svolením projektu Apache Felix. Tento plug-in se stará o zabalení aplikace jako balíček OSGi pro použití. Výpis 2 ukazuje konfiguraci, kterou použijeme.

Výpis 2. Plug-in OSGi Felix v Maven POM

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

Nyní se můžeme podívat na jednoduchou třídu, která vydá „Hello“.

Výpis 3. Dobrý den balíček JavaWorld OSGi

 balíček com.javaworld.osgi; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; veřejná třída HelloJavaWorld implementuje BundleActivator {public void start (BundleContext ctx) {System.out.println ("Hello JavaWorld."); } public void stop (BundleContext bundleContext) {}} 

Vytvořte balíček přechodem na příkazový řádek a zadáním mvn čistá instalace. Tím se vygeneruje soubor JAR obsahující balíček. Nyní přejděte na Soubor v grafickém uživatelském rozhraní Knoplerfish a vyberte Přidat balíček. Tím získáte prohlížeč souborů. Najděte soubor JAR, který jsme právě vytvořili, a vyberte jej.

Správa balíčků OSGi v kontejneru

Ve výstupním okně uživatelského rozhraní Knoplerfish se zobrazí vaše zpráva „Hello, JavaWorld“. Klikněte na balíček v grafickém uživatelském rozhraní Knoplerfish a uvidíte ID, které mu kontejner přidělil. Až budete připraveni balíček zastavit, můžete kliknout na položku nabídky Zastavit. Dalším způsobem je vstoupit zastavit [číslo balíčku] na příkazovém řádku. Balíčky v kontejneru můžete spravovat pomocí grafického uživatelského rozhraní nebo příkazového řádku.

Nyní máte představu o tom, jak funguje jednoduchý balíček v kontejneru OSGi. Kdekoli existuje kontejner OSGi, najdete stejnou jednoduchost při spouštění a zastavování balíčků. OSGi vytváří pro balíček prostředí a životní cyklus.

Interakce balíčků: Služby a klienti

Dále se podíváme na to, jak balíčky mezi sebou komunikují.

První věc, kterou uděláme, je vytvořit balíček služeb. Balíček služeb je analogický s fazolí relace EJB: Poskytuje komponentu, ke které lze přistupovat prostřednictvím jiných balíčků prostřednictvím vzdáleného rozhraní. Chcete-li vytvořit balíček služeb, musíme poskytnout rozhraní i implementační třídu.

Výpis 4. Rozhraní balíčku služeb

 balíček com.javaworld.osgi.service; veřejné rozhraní WhatIsOsgi {public Integer addNum (Integer x, Integer y); } 

Výpis 4 je jednoduché rozhraní. Jedinou metodou je a addNum () metoda, která udělá to, co znamená: vrátí sčítání dvou čísel. Implementace uvedená v seznamu 5 je stejně jednoduchá, ale přidává několik metod specifických pro OSGi.

Výpis 5. Implementace balíčku služeb

 balíček com.javaworld.osgi.service; veřejná třída WhatIsOsgiImpl implementuje WhatIsOsgi, BundleActivator {private ServiceReference ref; soukromý reg. registrace služby; @Override public Integer addNum (Integer x, Integer y) {return x + y; } @Override public void start (kontext BundleContext) vyvolá výjimku {reg = context.registerService (WhatIsOsgi.class, new WhatIsOsgiImpl (), new Hashtable ()); ref = reg.getReference (); } @Override public void stop (kontext BundleContext) vyvolá výjimku {reg.unregister (); }} 

Podívejme se blíže na to, co se děje v seznamu 5:

  1. veřejná třída WhatIsOsgiImpl implementuje WhatIsOsgi, BundleActivator: Zde implementujeme rozhraní, které jsme vytvořili. Všimněte si, že také implementujeme BundleActivator rozhraní, jako jsme to udělali s HelloJavaWorld příklad. Druhou možností je, že se tento balíček sám aktivuje.
  2. soukromá reference služby; private ServiceRegistration reg;: Jedná se o proměnné pro registrační službu OSGi a odkaz na balíček pro tuto službu.
  3. veřejné celé číslo addNum (celé číslo x, celé číslo y): Toto je jednoduchá implementace metody přidání.
  4. public void start (kontext BundleContext): Tato metoda spuštění je součástí BundleActivator rozhraní a provádí jej kontejner. V tomto příkladu získáme odkaz na registrační službu OSGi a použijeme ji na naši WhatIsOsgi rozhraní a implementace. Prázdné Hashtable je pro konfigurační parametry, které zde nepoužíváme. Dostaneme také odkaz na službu, kterou jsme právě vytvořili.
  5. public void stop (kontext BundleContext): Zde jednoduše zrušíme registraci služby. Tato jednoduchá služba spravuje nejzajímavější prvky svého životního cyklu. Jeho hlavním účelem je odhalit addNum metoda do kontejneru OSGi.

Klient OSGi

Dále napíšeme klienta, který může službu používat. Tento klient opět využije BundleActivator rozhraní. Také přidá ServiceListener rozhraní, jak je uvedeno v seznamu 6.

Výpis 6. Balíček klienta služby OSGi

 veřejná třída OsgiClient implementuje BundleActivator, ServiceListener {soukromý BundleContext ctx; soukromá služba ServiceReference; 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á metodu spuštění, která přidá posluchače služby. Tento posluchač je filtrován podle názvu třídy služby, kterou jsme vytvořili v seznamu 5. Když je služba aktualizována, zavolá serviceChanged () metoda, jak je uvedeno v seznamu 7.

Výpis 7. serviceChanged metoda

 public void serviceChanged (událost ServiceEvent) {int type = event.getType (); switch (type) {case (ServiceEvent.REGISTERED): serviceReference = event.getServiceReference (); Greeter service = (Greeter) (ctx.getService (service)); System.out.println ("Přidání 10 a 100:" + service.addNum (10, 100)); přestávka; case (ServiceEvent.UNREGISTERING): System.out.println ("Služba zrušena registrace."); ctx.ungetService (event.getServiceReference ()); // Uvolní odkaz na službu, aby mohla být přerušena GC'd; výchozí: konec; }} 

Všimněte si, že serviceChanged metoda se používá k určení, k jaké události došlo u služby, o kterou se zajímáme. Služba poté odpoví podle zadání. V tomto případě, když REGISTROVANÝ událost se objeví, využijeme addNum () metoda.

Alternativa OSGi

Toto byl rychlý úvod do OSGi, iniciativy Open Services Gateway Initiative. Jak jste viděli na příkladu Knoplerfish, OSGi poskytuje běhové prostředí, kde můžete definovat modulární komponenty Java (balíčky). Poskytuje definovaný životní cyklus pro hostování balíčků v klientovi a podporuje balíčky interagující jako klienti a služby v kontejneru. Všechny tyto funkce dohromady představují zajímavou alternativu ke standardním runtime a rámcům Java, zejména pro mobilní aplikace a IoT.

Na závěr si všimněte, že předchozí článek v seriálu „Co je to: Java“ představil systém Java Platform Module System, který nabízí odlišný přístup ke stejné výzvě modularity Java.

Tento příběh „Co je OSGi? Odlišný přístup k modularitě Java“ původně publikoval JavaWorld.

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