Précédent   Forum du club des développeurs et IT Pro > Java > Serveurs, conteneurs, et Java EE > Modularisation (OSGi, SCA...)
Modularisation (OSGi, SCA...) Forum d'entraide sur les architectures modulaires à base de composants et services (OSGi, SCA...). Avant de poster -> Les cours OSGi
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/04/2011, 14h35   #1
identifiant_bidon
Membre habitué
 
Inscription : juillet 2006
Messages : 690
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 690
Points : 132
Points : 132
Par défaut [OSGi] Faire un shutdown

Bonjour à tous,

Voici mon problème.
Pour mon projet, j'utilise OSGI et l'implémentation Felix d'OSGI. Je me suis basé sur les codes de la page suivante : http://felix.apache.org/site/apache-...-tutorial.html.

Mon souci qui va surement paraitre idiot (hein George7 ? ) et que je ne sais pas comment faire (mis à part un CTRL-C pas propre) pour faire en sorte qu'OSGI me rende la main après l'exécution de mes bundles.

Dois-je rajouter quelque chose dans mon code ?

Code :
1
2
3
4
5
6
7
8
9
10
11
		Map configMap = new StringMap(false);
		configMap.put(FelixConstants.LOG_LEVEL_PROP, "4");
		configMap.put(Constants.FRAMEWORK_STORAGE, cachedir.getAbsolutePath());
 
	        ...
 
		try
		{
			/** Now create an instance of the framework. */
			Felix felix = new Felix(configMap);
			felix.start();
ou alors dans le fichier config.properties ?

Merci
__________________
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 15h25   #2
George7
Membre Expert
 
Avatar de George7
 
Homme
Inscription : août 2006
Messages : 1 234
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : août 2006
Messages : 1 234
Points : 1 602
Points : 1 602
Salut,

Pour stopper le framework OSGi il faut arrêter le bundle core (qui a l'ID 0). Pour Felix, tu peux aussi regarder . De plus depuis la version 4 il y a un moyen standard de gérer le framework (sections 4.2 et 6.2 de la specification core) ce qui pourrait être intéressant pour toi (au lieu de nommer Felix explicitement).
Ensuite que veut dire "après l'exécution de mes bundles" ? Tes bundles ont une tâche qui est exécutée une fois et se finissent ensuite ? Je ne suis pas bien sûr de comprendre… Tu peux donner ton cas d'utilisation ici ?
__________________
"Ikea / furnishing = OSGi / software : They allow to have very modular things, but trying to put them together generally drives you crazy"
-- Mario Fusco

Pour vos développements Java : apprenez à utiliser la javadoc
George7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 16h02   #3
identifiant_bidon
Membre habitué
 
Inscription : juillet 2006
Messages : 690
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 690
Points : 132
Points : 132
Salut George7

Oui, en fait, j'ai pour le moment, un seul bundle (qui est mon bundle principal). Il effectue sa tâche une fois et j'en ai plus besoin.

Je suis parti de ce code pour mon bundle :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Activator implements BundleActivator
{
    public void start(final BundleContext context)
    {
    }
    public void stop(BundleContext context)
    {
    }
public static void main(String[] argv) throws Exception
    {
        final File cachedir = File.createTempFile("felix.example.extenderbased", null);
        Map configMap = new StringMap(false);
        configMap.put(FelixConstants.LOG_LEVEL_PROP, "4");
        configMap.put(Constants.FRAMEWORK_STORAGE, cachedir.getAbsolutePath());
        List list = new ArrayList();
        list.add(new AutoActivator(configMap));
        list.add(new Activator());
        configMap.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list);
        try
        {
            // Now create an instance of the framework.
            Felix felix = new Felix(configMap);
            felix.start();            
        }
        catch (Exception ex)
        {
            System.err.println("Could not create framework: " + ex);
            ex.printStackTrace();
            System.exit(-1);
        }
    }
}
Et donc, comme je le disais, je ne sais pas comment faire pour que Felix me rende la main.

Soit dit en passant, j'ai l'impression que c'est aussi le cas des exemples fournis à cet URL : http://felix.apache.org/site/apache-...-tutorial.html (si on enlève les boucles sans fin bien sûr)
__________________
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 14h58   #4
identifiant_bidon
Membre habitué
 
Inscription : juillet 2006
Messages : 690
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 690
Points : 132
Points : 132
Bon, désolé de remettre le problème sur le tapis mais je n'ai pas du tout eu le temps de m'en occuper (j'ai du à gérer une naissance notamment ).

Du coup, si quelqu'un à une réponse, je prends.
__________________
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 16h29   #5
Nemek
Modérateur
 
Avatar de Nemek
 
Homme Logan
Développeur Java
Inscription : août 2005
Messages : 1 701
Détails du profil
Informations personnelles :
Nom : Homme Logan
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : août 2005
Messages : 1 701
Points : 3 682
Points : 3 682
Pourquoi ne pas tout simplement le stopper ?
Nemek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 19h06   #6
George7
Membre Expert
 
Avatar de George7
 
Homme
Inscription : août 2006
Messages : 1 234
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : août 2006
Messages : 1 234
Points : 1 602
Points : 1 602
Citation:
Envoyé par identifiant_bidon Voir le message
Bon, désolé de remettre le problème sur le tapis mais je n'ai pas du tout eu le temps de m'en occuper (j'ai du à gérer une naissance notamment ).

Du coup, si quelqu'un à une réponse, je prends.
Salut,

Félicitations pour la naissance
Sinon pour ton problème, je résume (dis moi si je me trompe) : tu as un framework OSGi embarqué dans ton appli, tu le lances. Dedans n'est installé qu'un seul bundle. Il est démarré. Dans ton activator tu fais une tâche qui s'exécute une fois et tu voudrais qu'à la fin de cette tâche, ton framework s'arrête et te rende la main. J'ai bon ?
Si oui, alors en fait ça me semble une utilisation bizarre de OSGi, mais bon passons là dessus pour le moment pour se concentrer sur ton problème (je pars du principe que le but que tu veux atteindre exactement tu le connais, et que ce comportement est celui que tu veux atteindre, on pourra en reparler plus tard si tu veux). Comme je l'ai dit plus haut, ton framework est le bundle avec l'id 0. Donc à la fin de le méthode start de ton activator, tu peux utiliser le BundleContext pour choper le Bundle d'id 0 et le stopper.
Après il est possible de créer le framework avec la manière générique OSGi (depuis 4.2), ça te permet de ne pas utiliser de référence en dur à Felix, et de le lancer de manière asynchrone puis d'appeler waitForStop dans ton code (cf doc et les parties susmentionnées de la spec)
__________________
"Ikea / furnishing = OSGi / software : They allow to have very modular things, but trying to put them together generally drives you crazy"
-- Mario Fusco

Pour vos développements Java : apprenez à utiliser la javadoc
George7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 10h28   #7
identifiant_bidon
Membre habitué
 
Inscription : juillet 2006
Messages : 690
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 690
Points : 132
Points : 132
Salut George7

Merci pour tes félicitations (ce ne fut pas de tout repos, mais on y est arrivé )
Tu as parfaitement cerné ma situation.

J'ai bien conscience de ne pas utiliser OSGI de façon optimale mais je suis un peu dans l'urgence actuellement (mais j'apprécie beaucoup le fait que tu comprennes qu'il me serait difficile de reprendre de zéro. Pour le moment, je vais rester sur ce schéma et il sera temps de faire quelque chose de bien plus propre plus tard).

Concernant mon problème, désolé, je n'ai surement pas été assez précis. Je ne sais pas si cela suffit, mais à la fin de mon start, j'ai donc ajouté ceci :

Code :
1
2
3
4
5
 
		Bundle[] listBundles = context.getBundles();
		for (int i=0; i < listBundles.length; i++) {
			System.out.println("bundleId = " + listBundles[i].getBundleId() + " - symbolicName = " + listBundles[i].getSymbolicName());
		}
Il me rend 3 lignes. La première (id=0) pour le framework, la deuxième (id=1) pour mon core, et la troisième (id=2) pour un bundle log4j. J'ai l'intention de faire plusieurs projets. Les autres projets auront un bundle "plugin" supplémentaire. Chaque projet aura son propre bundle 'plugin".

Si je fais

Code :
1
2
		Bundle mainBundle = context.getBundle(0);
		mainBundle.stop();
Il ne me rend toujours pas la main. Le fait de faire Ctrl+C derrière n'a aucun effet et je dois fermer la console.

Si je fais

Code :
1
2
		Bundle bundleCore = context.getBundle(1);
		bundleCore.stop();
il ne me rend pas la main et lorsque je fais Ctrl+C pour prendre la main, j'ai une exception

Code :
1
2
3
4
5
java.lang.NullPointerException
	at org.apache.felix.framework.Felix.stopBundle(Felix.java:2237)
	at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1185)
	at org.apache.felix.framework.StartLevelImpl.run(StartLevelImpl.java:264)
	at java.lang.Thread.run(Unknown Source)
Je vais fouiller. Il me manque certainement quelque chose quelque part (soit dans mon manifest, soit dans le fichier conf.properties)

__________________
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 14h39   #8
George7
Membre Expert
 
Avatar de George7
 
Homme
Inscription : août 2006
Messages : 1 234
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : août 2006
Messages : 1 234
Points : 1 602
Points : 1 602
Je ne comprends pas trop là. La méthode start du framework doit démarrer OSGi sans bloquer. normalement il faudrait faire juste après le start:
Code :
1
2
3
 
felix.waitForStop(0);
System.exit(0);
(voir ici : http://felix.apache.org/site/apache-...hingaFramework)

Il est possible que tu aies un problème de thread non démon qui tourne toujours et donc la VM ne s'arrête pas.

Il ne sert à rien d'éteindre tous tes bundles un par un. Si tu stoppes celui d'id 0, tout seras proprement arrêté.
__________________
"Ikea / furnishing = OSGi / software : They allow to have very modular things, but trying to put them together generally drives you crazy"
-- Mario Fusco

Pour vos développements Java : apprenez à utiliser la javadoc
George7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2011, 16h56   #9
identifiant_bidon
Membre habitué
 
Inscription : juillet 2006
Messages : 690
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 690
Points : 132
Points : 132
Le truc que je ne comprends pas bien aussi, c'est que, si je passe bien par la méthode start, apparemment, je ne passe pas par le stop.
__________________
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 10h26   #10
identifiant_bidon
Membre habitué
 
Inscription : juillet 2006
Messages : 690
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 690
Points : 132
Points : 132
Oui George7, tu as bien raison, il y a un processus qui tourne toujours à la fin de l'installation (processus que je lance moi-même et dont j'ai besoin qu'il tourne après mon installation).

Si je fais un kill -9 sauvage de ce processus, la main m'est bien rendue.
__________________
https://www.weetool.com
identifiant_bidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h41.


 
 
 
 
Partenaires

Hébergement Web