IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OGSi Java Discussion :

[OSGi] Faire un shutdown


Sujet :

OGSi Java

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Invité
    Invité(e)
    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 ?

  3. #3
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    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
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Pourquoi ne pas tout simplement le stopper ?
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  6. #6
    Invité
    Invité(e)
    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)

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Invité
    Invité(e)
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  9. #9
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    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
    747
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 747
    Points : 185
    Points
    185
    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.

Discussions similaires

  1. IBatis + Derby : comment faire un shutdown ?
    Par jeanbabi dans le forum Persistance des données
    Réponses: 0
    Dernier message: 24/03/2009, 11h05
  2. Faire un shutdown à distance d'un pc Linux
    Par avigeilpro dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 27/06/2007, 23h36
  3. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44
  4. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo