UvodDoKomponent: MessagePrinterOsgi |
from Wiki KIVu |
V tomto tutoriálu se používá SpringSource Tool Suite.
Základem je samozřejmě rozhraní IMsgGen?
jako ve Springové implementaci MessagePrinterSpring. Práce s OSGi v Eclipsu (STS) je na této úrovni velice příjemná, protože Eclipse napovídá řešení a je schopný modifikovat MANIFEST, dle potřeby.
Rozhranní IMsgGen?
je definováno v serverové části a díky exportu je přístupné i u klienta. Implementace tohoto rozhranní je velice primitivní a zajímavý pak už může být pouze Activator. Ten službu zaregistruje a vypíše hlášku o startu - server běží.
V MANIFESTu? se musí přidat export package, aby měl klient přístup k rozhranní IMsgGen?
.
Zápis vypadá následovně:
Export-Package: cz.zcu.kiv.cosi.msgtalk
Ale je přístupný i přes GUI manifestu, záložka Runtime. V oblasti Exported Packages tlačítko Add a vybrat pomocí GUI.
V následujícím příkladu je vidět spuštění serveru:
1) Vytvoříme instanci IMsgGen?
2) Tuto službu zaregistrujeme pomocí metody registerService()
.
Jako první parametr je název rozhranní, které vytvořená třída implementuje. To se používá z důvodu nezávislosti na implementaci. Klient bude vždy chtít službu zaregistrovanou pod jménem cz.zcu.kiv.cosi.msgtalk.IMsgGen?
. A server může zaregistrovat buď tuto implementaci MsgGenImpl?
, nebo úplně jinou MsgGenAnotherImpl?
.
Jako druhý je aktivní objekt.
A jako třetí je tabulka parametrů, v tomto případě prázdná.
public void start(BundleContext? context) throws Exception { System.out.println("Starting server..."); msgGen = new MsgGenImpl?(); context.registerService("cz.zcu.kiv.cosi.msgtalk.IMsgGen?", msgGen, new Hashtable()); System.out.println("MsgGen? registered..."); }
Při ukončování je pak slušností odhlásit službu, tedy v metodě stop()
bude následující řádka:
context.ungetService(context.getServiceReference("cz.zcu.kiv.cosi.msgtalk.IMsgGen?"));
Abychom mohli pracovat, musíme nejprve importovat package, který obsahuje rozhranní <code>IMsgGen?</code>. Pak budeme už jen zkoušet v Activatoru zavolat službu registrovanou na tento interface.
V MANIFESTu? se musí přidat import package, aby měl klient přístup k rozhranní IMsgGen?
.
Import-Package: cz.zcu.kiv.cosi.msgtalk,
Ale je přístupný i přes GUI manifestu, záložka Dependencies. V oblasti Imported Packages tlačítko Add a vybrat pomocí GUI.
Abychom získali službu, musíme nejdříve získat referenci, to provedeme voláním metody getServiceReference()
a díky referenci můžeme získat již přímo službu voláním metody getService()
.
To je vše k získání služby, s kterou se již může pracovat dál.
public void start(BundleContext? context) throws Exception { msgGen = (IMsgGen?) context.getService(context.getServiceReference("cz.zcu.kiv.cosi.msgtalk.IMsgGen?")); System.out.println("client started..."); System.out.println(msgGen.getMsg()); }
V Run configurations ... je třeba zaškrtnout oba klienty Server i Klient a nastavit Serveru, aby se spouštěl před Klientem, tedy Start level menší než u Serveru.
V Eclipsu i STS je defaultně Start level na 4, dá se změnit u Default start level.