Tutorial OSGi avec Apache Felix - Partie 2
Jump to navigation
Jump to search
Sources du TP
TP OSGi Partie 2 : Composants OSGi
Vous manipulerez Apache iPOJO le modèle de composant orienté service Java pour OSGi utilisé industrielement
Installation
- Dézipper les sources du TP
- Changez EVENTUELLEMENT les valeurs du proxy dans le fichier tposgi\felix-framework\run.bat
Installez EVENTUELLEMENT osgi-part2\settings.xml dans C:\Documents and Settings\VotreUsername\.m2- Demarrez Felix :
cd felix
run.bat
- Lancez les commandes du shell Gogo:
- help
- lb
- obr:list
- obr:deploy -s "Apache Felix Log Service"
- felix:log debug
- obr:deploy -s "Apache Felix iPOJO"
- obr:deploy -s "Apache Felix iPOJO Gogo Command"
- obr:deploy -s "Apache Felix File Install"
- inspect requirement service
- inspect r service
- inspect capability service
- inspect c service
Cron4j
---------------
Cron4J http://www.sauronsoftware.it/projects/cron4j/ est une bibliotheque java pour dÈclencher pÈriodiquement des taches.
Elle est inspirée du cron Unix http://fr.wikipedia.org/wiki/Crontab.
Les taches doivent implémenter l'interface java.lang.Runnable.
Regardez les exemples fournis dans osgi-part2\cron4j\cron4j-orig\examples
Votre travail est d'utiliser cette bibliotheque pour dÈclencher pÈriodiquement des services OSGi dont l'interface est java.lang.Runnable et la propriÈtÈ cron4j.pattern contient le pattern cron
Voir le schÈma d'architecture osgi-part2\architecture.ppt
1) Deployez les bundles Cron4J depuis le repository via FileInstall en les dÈposant dans le rÈpertoire .\load de l'installation de Felix
cron4j-bundle-0.2.0-SNAPSHOT.jar
cron4j-bundle.example-0.1.0.jar
Que se passe t'il ?
lb
inspect c service
inspect r service
ipojo:factories
ipojo:factory
ipojo:handlers
ipojo:instance
ipojo:instances
2) completer le code du projet cron4j-bundle pour qu'il schedule des services java.lang.Runnable
Moins de 20 lignes de Java
3) ajouter au composant iPOJO un requires http://felix.apache.org/site/service-requirement-handler.html vers un LogService et completer le code du composant pour journaliser les enreisgrements et desenregistrement de services
(ie utiliser le LogService)
inspect c service
inspect r service
4) transformez ce Requires en TemporalRequires
Observez ce qu'il se passe quand le LogService disparait !
inspect c service
inspect r service
5) Completez le composant iPOJO pour fournir une commande Gogo Shell listant les "schedules" en cours et leurs statitisques (nombre d'invocations, temps restant jusqu'a la prochaine invocation, nombre d'invocation restante, ...)
Ce complement est livrÈe dans la version cron4j-bundle-0.3.0-SNAPSHOT.jar
inspect c service
inspect r service
Inspirez vous du code de la commande Arch d'iPOJO (voir le repertoire cron4j-cmd)
http://svn.apache.org/viewvc/felix/trunk/ipojo/arch-gogo/
http://svn.apache.org/viewvc/felix/trunk/ipojo/arch-gogo/pom.xml?view=co
http://svn.apache.org/viewvc/felix/trunk/ipojo/arch-gogo/src/main/java/org/apache/felix/ipojo/arch/gogo/Arch.java?view=co
http://felix.apache.org/site/rfc-147-overview.html
inspect c service
inspect r service
----------------
Extra 1
obr:deploy -s "Apache Felix iPOJO White Board Pattern Handler"
obr:deploy -s "Apache Felix iPOJO Temporal Service Dependency Handler"
obr:deploy -s "Apache Felix iPOJO WebConsole Plugins"
browse http://localhost:8080/system/console/bundles
Username=admin Password=admin
----------------
Extra 2
Ajouter les metadonnÈes du handler JMX au composant TransientCronDeamon
http://felix.apache.org/site/ipojo-jmx-handler.html
Redeployez le bundle
Lancez jconsole dans un shell/cmd
Changez les propriÈtÈs du composant via la JConsole
Minimal Gogo Command with iPOJO
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.ServiceProperty;
import org.apache.felix.service.command.Descriptor;
@Component(immediate = true)
@Instantiate
@Provides(specifications = ListComponentsCommand.class)
public class ListComponentsCommand {
@ServiceProperty(name = "osgi.command.scope", value = "test")
String scope;
@ServiceProperty(name = "osgi.command.function", value = "{}")
String[] function = new String[] { "test" };
@Descriptor("test")
public void test() {
System.out.println("test!");
}