Bevezetés az OSGi-be

1. Bemutatkozás

Számos Java küldetéskritikus és köztes alkalmazásnak vannak szigorú technológiai követelményei.

Egyeseknek támogatniuk kell a gyors telepítést, hogy ne zavarják a futó szolgáltatásokat - másoknak pedig képesnek kell lenniük arra, hogy ugyanazon csomag különböző verzióival dolgozzanak a külső örökölt rendszerek támogatása érdekében.

A OSGi platformok életképes megoldást jelentenek az ilyen jellegű követelmények támogatására.

A Nyissa meg a Service Gateway Initiative programot egy Java-alapú összetevő rendszert meghatározó specifikáció. Jelenleg a OSGi Szövetség, és első változata 1999-re nyúlik vissza.

Azóta kiváló szabványnak bizonyult az alkatrész rendszerek számára, és napjainkban széles körben használják. A Eclipse IDEpéldául egy OSGialapú alkalmazás.

Ebben a cikkben megvizsgáljuk a OSGi az által nyújtott megvalósítás kihasználása Apache.

2. OSGi alapismeretek

Az OSGi-ben egyetlen komponenst kötegnek nevezünk.

Logikusan, a csomag egy olyan funkció, amely független életciklussal rendelkezik - ami azt jelenti, hogy önállóan elindítható, leállítható és eltávolítható.

Technikailag a köteg csak egy jar fájl a MANIFEST.MF fájl, amely néhány OSGi-specifikus fejlécet tartalmaz.

A OSGi platform lehetőséget nyújt értesítések fogadására a kötegek elérhetővé válásáról, vagy amikor eltávolítják őket a platformról. Ez lehetővé teszi, hogy egy megfelelően megtervezett kliens tovább működhessen, esetleg leromlott funkcionalitással, még akkor is, ha a függő szolgáltatás pillanatnyilag nem érhető el.

Emiatt a csomagnak kifejezetten meg kell határoznia, hogy milyen csomagokhoz kell hozzáférnie és a OSGi platform csak akkor indítja el, ha a függőségek rendelkezésre állnak magában a csomagban vagy más, a platformra már telepített csomagokban.

3. Az eszközök beszerzése

Ben kezdjük az utunkat OSGi letöltésével Apache Karaf erről a linkről. Apache Karaf egy futó platform OSGi-alapú alkalmazások; a ApacheVégrehajtása OSGi nevű specifikáció Apache Felix.

Karaf néhány praktikus funkciót kínál a tetején Felix amelyek segítenek megismerkedni velünk OSGipéldául egy parancssori felület, amely lehetővé teszi számunkra, hogy kölcsönhatásba lépjünk a platformmal.

Telepíteni Karaf, követheti a telepítési utasításokat a hivatalos dokumentációból.

4. Köteg belépési pontja

Egy alkalmazás OSGi környezetben történő futtatásához azt csomagolnunk kell OSGi csomagolja be és adja meg az alkalmazás belépési pontját, és ez nem a szokásos public static void main (String [] érvel) módszer.

Tehát kezdjük egy OSGi- alapú „Hello World” alkalmazás.

Elkezdjük egy egyszerű függőség felállítását a magtól OSGi API:

 org.osgi org.osgi.core 6.0.0 biztosított 

A függőség a következőképpen van deklarálva: biztosítani mert elérhető lesz a OSGi futásidejű, és a csomagnak nem kell beágyaznia.

Írjuk most az egyszerűt Helló Világ osztály:

public class HelloWorld megvalósítja a BundleActivator {public void start (BundleContext ctx) {System.out.println ("Hello world."); } public void stop (BundleContext bundleContext) {System.out.println ("Viszlát világ."); }}

BundleActivator egy interfész, amelyet a OSGi amelyet olyan osztályoknak kell megvalósítaniuk, amelyek egy csomag belépési pontjai.

A Rajt() metódust a OSGi platformot, amikor elindul az ezt az osztályt tartalmazó csomag. Másrészről álljon meg() közvetlenül a csomag leállítása előtt hívják meg.

Tartsuk szem előtt, hogy minden csomag legfeljebb egyet tartalmazhat BundleActivator. A BundleContext A mindkét módszerhez biztosított objektum lehetővé teszi az interakciót a OSGi futási idő. Hamarosan visszatérünk rá.

5. Csomag készítése

Módosítsuk a pom.xml és tényleges OSGi csomaggá tegye.

Először is kifejezetten ki kell jelentenünk, hogy egy csomagot fogunk építeni, nem pedig korsót:

csomag

Ezután kihasználjuk a maven-bundle-plugin, jóvoltából Apache Felix közösség, a Helló Világ osztály, mint egy OSGi csomag:

 org.apache.felix maven-bundle-plugin 3.3.0 true $ {pom.groupId}. $ {pom.artifactId} $ {pom.name} $ {pom.version} com.baeldung.osgi.sample.activator.HelloWorld com.baeldung.osgi.sample.aktivátor 

Az utasítások részben megadjuk a OSGi fejléceket, amelyeket fel akarunk venni a csomag MANIFEST fájljába.

Csomag-aktivátor a. teljes név BundleActivator a csomag elindításához és leállításához használt implementáció, amely az imént írt osztályra vonatkozik.

Privát csomag nem OSGi fejléc, de arra használják, hogy a beépülő modul megmondja, hogy a csomagot vegye fel a csomagba, de ne tegye elérhetővé másoknak. Most a szokásos paranccsal felépíthetjük a csomagot mvn tiszta telepítés.

6. A csomag telepítése és futtatása

Kezdjük Karaf a parancs végrehajtásával:

/ bin / karaf start

hol az a mappa, ahol Karaf telepítve van. Amikor a Karaf megjelenik a konzol, a következő parancsot tudjuk végrehajtani a csomag telepítéséhez:

> csomag: mvn telepítése: com.baeldung / osgi-intro-sample-activator / 1.0-SNAPSHOT csomag azonosító: 63

Ez utasítja Karafot, hogy töltse be a csomagot a helyi Maven-tárból.

Cserébe Karaf kinyomtatja a köteghez rendelt numerikus azonosítót, amely a már telepített csomagok számától függ és változhat. A csomag most telepítve van, most a következő paranccsal indíthatjuk:

> csomag: indul 63 Hello World

A „Hello World” azonnal megjelenik, amint a csomag elindul. Mostantól leállíthatjuk és eltávolíthatjuk a csomagot:

> bundle: stop 63> bundle: uninstall 63

A „Viszlát világ” felirat jelenik meg a konzolon, a kódnak megfelelően álljon meg() módszer.

7. OSGi szolgáltatás

Folytassuk egy egyszerű írásával OSGi szolgáltatás, egy felület, amely bemutatja az emberek köszöntésének módját:

com.baeldung.osgi.sample.service.definition csomag; nyilvános felület Köszöntő {public String sayHiTo (String name); }

Írjunk egy megvalósítást, amely a BundleActivator is, így a csomag indításakor képesek vagyunk a szolgáltatás példányosítására és regisztrálására a platformon:

com.baeldung.osgi.sample.service.implementation csomag; public class GreeterImpl implementálja Greeter, BundleActivator {private ServiceReference referencia; privát ServiceRegistration regisztráció; @Orride public String sayHiTo (String name) {return "Hello" + name; } @Orride public void start (BundleContext context) dobja a kivételet {System.out.println ("Szolgáltatás regisztrálása."); regisztráció = context.registerService (Greeter.osztály, új GreeterImpl (), új Hashtable ()); referencia = regisztráció .getReference (); } @Orride public void stop (BundleContext context) a (z) {System.out.println ("Szolgáltatás regisztrációjának megszüntetése") kivételt dobja; regisztráció.regisztrálás (); }}

Használjuk a BundleContext a kérés eszközeként OSGi platform a szolgáltatás új példányának regisztrálásához.

Meg kell adnunk a szolgáltatás típusát és a lehetséges konfigurációs paraméterek térképét is, amelyekre az egyszerű forgatókönyvünkben nincs szükség. Most folytassuk a maven-bundle-plugin:

 org.apache.felix maven-bundle-plugin true $ {project.groupId}. $ {project.artifactId} $ {project.artifactId} $ {project.version} com.baeldung.osgi.sample.service.implementation.GreeterImpl com .baeldung.osgi.sample.service.implementation com.baeldung.osgi.sample.service.definition 

Érdemes megjegyezni, hogy csak a com.baeldung.osgi.sample.service.definition a csomagot ezúttal a Export-csomag fejléc.

Ennek köszönhetően OSGi lehetővé teszi, hogy más csomagok csak a szolgáltatási felületen megadott módszereket hívják meg. Csomag com.baeldung.osgi.sample.service.implementation privátként van megjelölve, így más csomag nem fogja tudni közvetlenül elérni a megvalósítás tagjait.

8. OSGi kliens

Most írjuk meg a klienst. Egyszerűen megkeresi a szolgáltatást indításkor és meghívja:

public class Ügyfél implementálja a BundleActivator, ServiceListener {}

Végezzük el a BundleActivator start () módszer:

privát BundleContext ctx; privát ServiceReference serviceReference; public void start (BundleContext ctx) {this.ctx = ctx; próbálkozzon a {ctx.addServiceListener (this, "(objectclass =" + Greeter.class.getName () + ")"); } catch (InvalidSyntaxException ise) {ise.printStackTrace (); }}

A addServiceListener () módszer lehetővé teszi az ügyfél számára, hogy kérje a platformot, hogy küldjön értesítéseket a szolgáltatásról, amely megfelel a megadott kifejezésnek.

A kifejezés az LDAP-hoz hasonló szintaxist használ, és esetünkben értesítéseket kérünk a-ról Üdvözlő szolgáltatás.

Folytassuk a visszahívási módszerrel:

public void serviceChanged (ServiceEvent serviceEvent) {int type = serviceEvent.getType (); kapcsoló (típus) {eset (ServiceEvent.REGISTERED): System.out.println ("Értesítés a szolgáltatásról regisztrálva."); serviceReference = serviceEvent .getServiceReference (); Üdvözlő szolgáltatás = (Üdvözlő) (ctx.getService (serviceReference)); System.out.println (service.sayHiTo ("John")); szünet; eset (ServiceEvent.UNREGISTERING): System.out.println ("Értesítés a szolgáltatásról nincs regisztrálva."); ctx.ungetService (serviceEvent.getServiceReference ()); szünet; alapértelmezett: break; }}

Amikor valamilyen módosítással jár a Üdvözlő szolgáltatás megtörténik, a módszert értesítik.

Amikor a szolgáltatás regisztrálva van a platformra, kapunk rá hivatkozást, helyben tároljuk, majd felhasználjuk a szolgáltatási objektum megszerzésére és meghívására.

Amikor a kiszolgálót később törlik a regisztráció, akkor a korábban tárolt hivatkozást használjuk a törléshez, vagyis azt mondjuk a platformnak, hogy már nem fogjuk használni.

Most már csak meg kell írnunk a álljon meg() módszer:

public void stop (BundleContext bundleContext) {if (serviceReference! = null) {ctx.ungetService (serviceReference); }}

Itt ismét megszüntetjük a szolgáltatást, hogy lefedjük azt az esetet, amikor az ügyfelet a szolgáltatás leállítása előtt leállítják. Vessünk egy utolsó pillantást a függőségekre a pom.xml:

 com.baeldung osgi-intro-sample-service 1.0-SNAPSHOT biztosított org.osgi org.osgi.core 6.0.0 

9. Ügyfél és szolgáltatás

Telepítsük most az ügyfél- és szolgáltatási csomagokat a Karafba az alábbiak szerint:

> mvn telepítése: com.baeldung / osgi-intro-sample-service / 1.0-SNAPSHOT csomag azonosítója: 64> install mvn: com.baeldung / osgi-intro-sample-client / 1.0-SNAPSHOT csomag azonosító: 65

Mindig tartsa szem előtt, hogy az egyes kötegekhez rendelt azonosító számok változhatnak.

Indítsuk el most az ügyfélcsomagot:

> kezdet 65

Ezért semmi sem történik, mert az ügyfél aktív, és várja a szolgáltatást, amellyel kezdhetjük:

> start 64 A szolgáltatás regisztrálása. Szolgáltatás regisztrálva. Szia John

Az történik, hogy amint a szolgáltatás BundleActivator elindul, a szolgáltatás regisztrálásra kerül a platformon. Ez viszont értesíti az ügyfelet arról, hogy a várt szolgáltatás elérhető.

Ezután az ügyfél megkapja a szolgáltatásra vonatkozó hivatkozást, és annak felhasználásával hívja meg a szolgáltatáscsomagon keresztül nyújtott megvalósítást.

10. Következtetés

Ebben a cikkben az OSGi alapvető jellemzőit dolgoztuk fel egy egyszerű példával, amely elegendő az OSGi lehetőségeinek megértéséhez.

Összegzésként elmondhatjuk, hogy amikor garantálnunk kell, hogy egyetlen alkalmazást kelletlenség nélkül kell frissíteni, az OSGi életképes megoldás lehet.

A bejegyzés kódja megtalálható a GitHub oldalon.


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