Hlavní menu

Nástroje

UvodDoKomponent / MessagePrinterOsgi

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

Updated 22 January 2015, 16:11 by PremekBrada

MessagePrinter v OSGi

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.

Server

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ěží.

Export package

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.

Activator

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?"));

Klient

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.

Import package

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.

Activator

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());
	}

Spuštění

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.