Hlavní menu

Nástroje

UvodDoKomponent / DeclarativeServices

View (print) - Edit page | Recent changes - Page history

Updated 05 January 2010, 15:10 by Snajberk

Navigace

Declarative Services

Je nejpodobnější Spring DM.

Myšlenkou Declarative Services je rozšíření OSGi, aby byla jednodušší správa služeb. DS nám rovněž ve snadno přístupném konfiguračním souboru odkrývá všechny služby, které zveřejňuje a které potřebuje.

Je vhodné přečíst si kapitoly o Springu a OSGi

DS framework

V tomto případě už snad ani nejde mluvit o frameworku jako u Spring DM. DS nám totiž poskytuje pouze lepší práci se službami. Mluvme tedy o DS jako o rozšíření OSGi frameworku. V tomto případě tedy můžeme vynechat i všechny další komponentové pojmy, protože ty zůstávají stejné jako u OSGi.

Změny v DS

Je přidán nový konfigurační soubor. Vedle META-INF/MANIFEST.MF je zde ještě OSGI-INF/konfSoubor.xml. Jméno tohoto konfiguračního souboru není pevně dáno.

Využívá se nový namespace, který přímo reprezentuje komponentu - bundle.

  • <implementation>: lze určit, jaká je hlavní (spouštěcí) třída => opět se nemusí používat activator.
  • <service>: zde se registrují služby
  • <provide>: určí na jaké rozhranní se má služba zaregistrovat
  • <property>: nastaví property zveřejněné službě
  • <reference>: získá a naváže službu na metodu, která si získaný interface dále zpracuje

Ukázka:

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
enabled="true" immediate="true" name="ParkovisteDSPult">

<implementation class="cz.zcu.kiv.cosi.parkoviste.pult.Pult"/>

<service>
<provide interface="org.osgi.service.event.EventHandler"/>
</service>

<property name="event.topics" value="parkoviste/*"/>

<reference bind="setStatistika" cardinality="1..1"
interface="cz.zcu.kiv.cosi.parkoviste.brana.IPrijeloOdjelo"
name="IPrijeloOdjelo" policy="dynamic"/>
</scr:component>

Praktická část

V těchto návodech pracuji s SpringSource Tool Suite, které je trochu odlišné od Eclipsu. Většina věcí je však stejná.

Declarative services není plnohodnotný framework, ale pouze rozšíření OSGi. Při implementaci příkladů jsem vzal kompletní funkční část z OSGi - ale bez Activatorů. To je vlastně téměř jediný rozdíl v kódu oproti Osgi. Declarative Services umí vlastně úplně to samé jako SpringDM, pouze používá jiný přístup.

Místo activatorů jsou zde komponentové xml soubory.

TutoriálDeclarativeServices na vytvoření nového projektu.

Jednoduchá implementace HelloWorld. Výsledná implementace: Attach:HelloWorldDS

Příklad MessagePrinterDS pak dokumentuje jen technologicky specifické problémy. Výsledná implementace: Attach:MessagePrinterDS

Příklad ParkovisteDS pak dokumentuje jen technologicky specifické problémy. Výsledná implementace: Attach:ParkovisteDS

Poznámky k DS

1) Jakmile u komponenty registruji <service>, komponenta se okamžitě stává delayed, což znamená, že nebude nic dělat, dokud někdo nebude registrovanou službu chtít - pak teprve dojde k vytvoření dané komponenty.

2) Pokud chci spouštět komponentu s registrovanou službou okamžitě (mám v ní metodu activate), musím nastavit <scr:component immediate="true" ...>

3) Je třeba si dávat pozor, na obsah definičního souboru - každá drobnost může způsobit nefunkčnost a nehlásí žádnou chybu.

4) I když je nastaven okamžitý start u komponenty, která registruje službu (například EventHandler?), služba se prostě nezaregistruje. Něco takového asi prostě není možné :)