Programmēšana

Kas ir OSGi? Atšķirīga pieeja Java modularitātei

OSGi atvieglo moduļu Java komponentu (sauktu saišķi), ko var izvietot konteinerā. Kā izstrādātājs jūs izmantojat OSGi specifikāciju un rīkus, lai izveidotu vienu vai vairākus saišķus. OSGi nosaka šo paku dzīves ciklu. Tas arī viņus uzņem un atbalsta viņu mijiedarbību konteinerā. Jūs varat iedomāties OSGi konteineru, kas ir aptuveni līdzīgs JVM, ar papildu pilnvarām. Tāpat domājiet par saišķiem kā Java lietojumprogrammām ar unikālām spējām. Komplekti darbojas OSGi konteinerā kā klienta un servera komponenti.

OSGi alianse

OSGi sākās 1999. gadā, un atšķirībā no daudzām citām specifikācijām standartu nepārvalda Oracle, Java Community Process vai Eclipse Foundation. Tā vietā to pārvalda OSGi alianse.

Ar ko OSGi atšķiras

OSGi filozofija atšķiras no citiem Java balstītajiem ietvariem, it īpaši Spring. OSGi vienā konteinerā var pastāvēt vairākas lietojumprogrammas: OSGi paketes izpildlaika vide. Konteiners nodrošina, ka katrs komponents ir pietiekami izolēts, un tam ir arī piekļuve visām nepieciešamajām atkarībām. OSGi var atbalstīt atkarības ievadīšanu, ko standartizē Auns Blueprint projekts. Papildus OSGi vadības inversijas (IoC) konteinera nodrošināšanai Auns atbalsta standarta Java ietvarus, piemēram, Java Persistence API (JPA).

OSGi paketes var atklāt pakalpojumus, kurus citi paketes izmanto. Komplekts var arī deklarēt versiju un noteikt, no kādiem citiem komplektiem tas ir atkarīgs. Pēc tam izpildlaiks automātiski ielādēs visus komplektus atkarības secībā. OSGi vienā un tajā pašā komplektā var pastāvēt vairākas versijas, ja to prasa paketes atkarības.

OSGi Eclipse IDE un Equinox

OSGi kaut kādā formā pastāv jau pāris gadu desmitus. To izmanto daudzām labi zināmām lietojumprogrammām, sākot no iegultām mobilajām ierīcēm līdz lietojumprogrammu serveriem un IDE.

Populārais Eclipse IDE ir uzbūvēts virs OSGi. Eclipse OSGi konteinera ieviešanu sauc par Equinox. Tas ir lielisks piemērs OSGi izpratnei. Pamatojoties uz OSGi, Equinox ir modulāra platforma. Tajā mitināti dažādi pakalpojumi, kurus izstrādātāji var pievienot pēc vēlēšanās. Katrs no tiem piedāvā iespēju, kas izstrādātājam varētu būt nepieciešama viņu IDE. Varat pievienot Java un JavaScript redaktorus, lietotņu serveri un datu bāzes savienotāju. Katrs no tiem tiek ieviests kā OSGi pakete, kas tiek pievienota konteineram un var mijiedarboties ar citiem konteinera pakalpojumiem.

Nesen ir pieaugusi interese par OSGi lietisko lietu internetam (IoT) izmantošanu. OSGi ir dabiski piemērota šāda veida attīstībai, kurai ir dažādas programmatūras sastāvdaļas, kas ierīcēs darbojas blakus, ne vienmēr zinot par otru. OSGi konteiners nodrošina vienkāršu un standartizētu veidu, kā mitināt šos dinamiskos programmatūras komponentus.

OSGi izmantošana Java projektā: Knoplerfish OSGi

Mēs strādāsim ar lietojumprogrammas piemēru, kas OSGi koncepcijas padarīs konkrētākas. Mūsu piemērs ir balstīts uz Knoplerfish OSGi izpildlaiku, kas tiek izmantots daudzos ražošanas izvietojumos. Knoplerfish ietver GUI un komandrindas saskarni (CLI) OSGi konteinera un tā saišu pārvaldīšanai.

Vispirms jūs lejupielādēsit Knoplerfish. Pašreizējā versija šī raksta tapšanas laikā ir Knoplerfish OSGi 6.1.3. Lasot šo rakstu, varat aizstāt šo versiju ar visu jaunāko.

Pēc Knoplerfish lejupielādes un instalēšanas izmantojiet CLI, lai nomestu direktorijā, kurā lejupielādējāt JAR failu, un ievadiet: java -jar framework.jar. Tas palaidīs izpildāmo JAR, un jūs vajadzētu sveikt ar GUI logu.

Knoplerfish OSGi GUI

Sākumā Knoplerfish OSGi GUI var šķist milzīgs, taču pamati ir vienkārši:

  • Ekrāna augšdaļā ir izvēlne.
  • Kreisajā pusē ir pakete, kas ir ielādēta izpildlaikā.
  • Pa labi ir informācijas logs.
  • Apakšā ir teksta izvades konsole.
  • Pašā apakšā ir ievades konsole.
Metjū Taisons

Tips palīdzība ievades konsolē, ja vēlaties redzēt palīdzības opcijas.

Pirms mēs pārietam uz piemēru, ieskatieties skriešanas saišķu komplektā. Jūs redzēsiet saiti, ko sauc HTTP serveris, kas nozīmē, ka pakete, kurā darbojas HTTP serveris, ir izveidots. Atveriet pārlūkprogrammu un pārbaudiet vietni // localhost: 8080. Protams, jūs redzēsiet Knoplerfish tīmekļa lapu.

“Hello JavaWorld” pakete

Izmantosim OSGi izpildlaiku, lai izveidotu vienkāršu paketi, kuru es sauktu Sveiki JavaWorld. Šī pakete izsūta ziņojumu konsolei.

1. sarakstā mēs izmantojam Maven, lai izveidotu saišķi. Tam ir tikai viena atkarība, ko nodrošina OSGi alianse.

Uzskaitījums 1. OSGi atkarība no Maven POM

   org.osgi org.osgi.core 

Tagad mēs izmantosim arī spraudni, pateicoties Apache Felix projektam. Šis spraudnis rūpējas par lietotnes iesaiņošanu kā OSGi paketi lietošanai. 2. saraksts parāda konfigurāciju, kuru izmantosim.

2. OSGi Felix spraudnis Maven POM sarakstā

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

Tagad mēs varam apskatīt vienkāršo klasi, kas izdos “Hello”.

Saraksts 3. Sveiki JavaWorld OSGi pakete

 pakete com.javaworld.osgi; importēt org.osgi.framework.BundleActivator; importēt org.osgi.framework.BundleContext; publiskā klase HelloJavaWorld ievieš BundleActivator {public void start (BundleContext ctx) {System.out.println ("Hello JavaWorld."); } public void stop (BundleContext bundleContext) {}} 

Izveidojiet paketi, dodoties uz komandrindu un ierakstot mvn tīra instalēšana. Tādējādi tiks izvadīts JAR fails ar paketi. Tagad dodieties uz Fails izvēlnē Knoplerfish GUI un atlasiet Pievienojiet paketi. Tas nodrošinās failu pārlūku. Atrodiet tikko izveidoto JAR un atlasiet to.

Konteinerā esošo OSGi saišu pārvaldīšana

Knoplerfish lietotāja saskarnes izvades logā redzēsiet ziņojumu “Sveiki, JavaWorld”. Noklikšķiniet uz komplekta Knoplerfish GUI, un jūs varat redzēt ID, kuru konteiners tam ir piešķīris. Kad esat gatavs apturēt paketi, varat noklikšķināt uz izvēlnes vienuma Apturēt. Vēl viens veids ir iekļūt stop [saišķa numurs] komandrindā. Konteinerā esošos saišķus var pārvaldīt, izmantojot GUI vai komandrindu.

Tagad jūs saprotat, kā vienkāršs saišķis darbojas OSGi konteinerā. Visur, kur eksistē OSGi konteiners, saišķu palaišanā un apturēšanā jūs atradīsit tādu pašu vienkāršību. OSGi rada paketes vidi un dzīves ciklu.

Paketes mijiedarbība: pakalpojumi un klienti

Tālāk mēs aplūkosim, kā saišķi savstarpēji sazinās.

Vispirms mēs izveidosim pakalpojumu pakete. Pakalpojuma pakete ir analoga EJB sesijas pupiņai: tā nodrošina komponentu, kuram citi attēli var piekļūt, izmantojot attālo saskarni. Lai izveidotu pakalpojumu paketi, mums jānodrošina gan saskarne, gan ieviešanas klase.

Uzskaitījums 4. Pakalpojuma paketes saskarne

 pakete com.javaworld.osgi.service; publiskā saskarne WhatIsOsgi {public Integer addNum (Integer x, Integer y); } 

4. saraksts ir vienkāršs interfeiss. Vienīgā metode ir a addNum () metode, kas darīs to, ko tas nozīmē: atgrieziet divu skaitļu pievienošanu. 5. sarakstā redzamā ieviešana ir vienlīdz vienkārša, taču tajā tiek pievienotas pāris OSGi specifiskas metodes.

Saraksts 5. Pakalpojuma paketes ieviešana

 pakete com.javaworld.osgi.service; publiskā klase WhatIsOsgiImpl īsteno WhatIsOsgi, BundleActivator {private ServiceReference ref; privātā ServiceRegistration reg; @Override public Integer addNum (Integer x, Integer y) {return x + y; } @Orride public void start (BundleContext context) izmet izņēmumu {reg = context.registerService (WhatIsOsgi.class, new WhatIsOsgiImpl (), new Hashtable ()); ref = reg.getReference (); } @Orride public void stop (BundleContext context) izmet izņēmumu {reg.unregister (); }} 

Apskatīsim tuvāk to, kas notiek 5. sarakstā:

  1. publiskā klase WhatIsOsgiImpl īsteno WhatIsOsgi, BundleActivator: Šeit mēs ieviešam mūsu izveidoto saskarni. Ņemiet vērā, ka mēs arī ieviešam BundleActivator interfeisu, kā mēs to darījām ar SveikiJavaWorld piemērs. Pēdējais ir tāpēc, ka šis saišķis pats sevi aktivizēs.
  2. privāts ServiceReference ref; privātā ServiceRegistration reg;: Tie ir attiecīgi mainīgie mainīgajiem OSGi reģistrācijas pakalpojumam un šī pakalpojuma paketes atsaucei.
  3. public Integer addNum (Integer x, Integer y): Šī ir vienkārša pievienošanas metodes ieviešana.
  4. public void start (BundleContext konteksts): Šī sākuma metode ir daļa no BundleActivator interfeisu, un to izpilda konteiners. Šajā piemērā mēs iegūstam atsauci uz OSGi reģistrācijas pakalpojumu un izmantojam to savam KasIsOsgi saskarne un ieviešana. Tukšais Hashtable ir paredzēts konfigurācijas parametriem, kurus mēs šeit neizmantojam. Mēs arī iegūstam atsauci uz tikko izveidoto pakalpojumu.
  5. public void stop (BundleContext konteksts): Šeit mēs vienkārši reģistrējam pakalpojumu. Šis vienkāršais pakalpojums vienkārši pārvalda vissliktākos tā dzīves cikla elementus. Tās galvenais mērķis ir atklāt addNum metodi OSGi konteineram.

OSGi klients

Tālāk uzrakstīsim klientu, kurš var izmantot pakalpojumu. Šis klients atkal izmantos BundleActivator interfeiss. Tas arī pievienos ServiceListener saskarni, kā parādīts 6. sarakstā.

Uzskaitījums 6. OSGi pakalpojuma klienta pakete

 publiskā klase OsgiClient īsteno BundleActivator, ServiceListener {private BundleContext ctx; privāts ServiceReference pakalpojums; public void start (BundleContext ctx) {this.ctx = ctx; mēģiniet {ctx.addServiceListener (this, "(objectclass =" + WhatIsOsgi.class.getName () + ")"); } catch (InvalidSyntaxException ise) {ise.printStackTrace (); }}} 

6. sarakstā ir sākuma metode, kas pievienos pakalpojumu klausītāju. Šis klausītājs tiek filtrēts pēc pakalpojuma klases nosaukuma, kuru izveidojām 5. sarakstā. Kad pakalpojums tiks atjaunināts, tas izsauks serviceChanged () metodi, kā parādīts 7. sarakstā.

Sarakstā 7. serviceChanged metode

 public void serviceChanged (ServiceEvent event) {int type = event.getType (); slēdzis (tips) {gadījums (ServiceEvent.REGISTERED): serviceReference = event.getServiceReference (); Apsveikuma pakalpojums = (Sveicējs) (ctx.getService (pakalpojums)); System.out.println ("Pievienojot 10 un 100:" + service.addNum (10, 100)); pārtraukums; gadījums (ServiceEvent.UNREGISTERING): System.out.println ("Pakalpojums nav reģistrēts."); ctx.ungetService (event.getServiceReference ()); // Izlaiž atsauci uz pakalpojumu, lai to varētu izjaukt GC'd; noklusējums: pārtraukums; }} 

Ņemiet vērā, ka serviceChanged metodi izmanto, lai noteiktu, kāds notikums ir noticis pakalpojumam, kas mūs interesē. Pēc tam pakalpojums atbildēs, kā norādīts. Šajā gadījumā, kad REĢISTRĒTS parādās notikums, mēs izmantojam addNum () metodi.

OSGi alternatīva

Šis ir ātrs ievads OSGi, Open Services Gateway Initiative. Kā redzējāt Knoplerfish piemērā, OSGi nodrošina izpildlaika vidi, kurā varat definēt modulārus Java komponentus (saišķus). Tas nodrošina noteiktu paketes mitināšanas klienta dzīves ciklu un atbalsta paketes, kas mijiedarbojas kā klienti un konteinera pakalpojumi. Visas šīs iespējas kopā piedāvā interesantu alternatīvu standarta Java izpildlaikiem un ietvariem, īpaši mobilajām un IoT lietojumprogrammām.

Visbeidzot, ņemiet vērā, ka iepriekšējā sērijas “Kas ir: Java” rakstā tika ieviesta Java platformas moduļu sistēma, kas piedāvā atšķirīgu pieeju tam pašam Java modularitātes izaicinājumam.

Šo stāstu "Kas ir OSGi? Atšķirīga pieeja Java modularitātei" sākotnēji publicēja JavaWorld.

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