Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Membre habitué
    Inscrit en
    juillet 2006
    Messages
    718
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 718
    Points : 139
    Points
    139

    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

  2. #2
    Membre Expert
    Avatar de George7
    Homme Profil pro
    Inscrit en
    août 2006
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : août 2006
    Messages : 1 234
    Points : 1 477
    Points
    1 477

    Par défaut

    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

  3. #3
    Membre habitué
    Inscrit en
    juillet 2006
    Messages
    718
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 718
    Points : 139
    Points
    139

    Par défaut

    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)

  4. #4
    Membre habitué
    Inscrit en
    juillet 2006
    Messages
    718
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 718
    Points : 139
    Points
    139

    Par défaut

    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.

  5. #5
    Modérateur
    Avatar de Nemek
    Homme Profil pro Logan
    Architecte technique
    Inscrit en
    août 2005
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Nom : Homme Logan
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : août 2005
    Messages : 2 067
    Points : 4 213
    Points
    4 213

    Par défaut

    Pourquoi ne pas tout simplement le stopper ?

  6. #6
    Membre Expert
    Avatar de George7
    Homme Profil pro
    Inscrit en
    août 2006
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : août 2006
    Messages : 1 234
    Points : 1 477
    Points
    1 477

    Par défaut

    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

  7. #7
    Membre habitué
    Inscrit en
    juillet 2006
    Messages
    718
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 718
    Points : 139
    Points
    139

    Par défaut

    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)


  8. #8
    Membre Expert
    Avatar de George7
    Homme Profil pro
    Inscrit en
    août 2006
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : août 2006
    Messages : 1 234
    Points : 1 477
    Points
    1 477

    Par défaut

    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

  9. #9
    Membre habitué
    Inscrit en
    juillet 2006
    Messages
    718
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 718
    Points : 139
    Points
    139

    Par défaut

    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.

  10. #10
    Membre habitué
    Inscrit en
    juillet 2006
    Messages
    718
    Détails du profil
    Informations forums :
    Inscription : juillet 2006
    Messages : 718
    Points : 139
    Points
    139

    Par défaut

    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.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •