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

CORBA Discussion :

resolve_initial_references("NameService") pose problème


Sujet :

CORBA

  1. #1
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut resolve_initial_references("NameService") pose problème
    Bonjour à tous (encore),

    J'ai un petit souci lorsque j'execute mon serveur. Il me sort une SystemException lorsque la ligne " obj = orb->resolve_initial_references("NameService");". Normalement, mon NameService est lancé... Qu'est ce que cette erreur signifie ??

    Sorry de poser plein de bêtes questions

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    #include <iostream>
    #include <string>
    #include "HelloImpl.h"
    
    using namespace std;
    
    static CORBA::Boolean bindObjectToName(CORBA::ORB_ptr, CORBA::Object_ptr);
    
    int main(int argc, char* argv[])
    {
    	int exitStatus = 0;
    
    	try {
    		// Init du ORB
    		CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
    		cout << "ORB initialization \t\t\t [ ok ]\n";
    
    		// Création du serveur
    		HelloImpl *srv = new HelloImpl("Coucou");
    		cout << "Server création \t\t\t [ ok ]\n";
    
    		// Init du POA
    		CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
    		PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);
    		cout << "POA initialization \t\t\t [ ok ]" << endl;
    
    		// Enregistrement du serveur auprès du POA
    		PortableServer::ObjectId_var svId = poa->activate_object(srv);
    		cout << "Server POA registration \t\t [ ok ]" << endl;
    
    		// Binding entre le "nom" et la ref du srvHello
    		Hello_var srvReference = srv->_this();
    		CORBA::String_var srvToString = orb->object_to_string(srvReference);
    		if(bindObjectToName(orb, srvReference))
    			cout << "Server binding \t\t\t\t [ ok ]\n";
    		else		
    			exitStatus = 1;
    
    	}
    	catch(CORBA::SystemException& e) {
    		cerr << "Caught CORBA::SystemException." << endl;
    	}
    	catch(CORBA::Exception& e) {
    		cerr << "Caught CORBA::Exception." << endl;
    	}
    	catch(...) {
    		cerr << "Caught unknown exception." << endl;
    	}
    
    	return exitStatus;
    
    
    };
    
    
    
    
    
    
    
    static CORBA::Boolean
    bindObjectToName(CORBA::ORB_ptr orb, CORBA::Object_ptr objref)
    {
    	cout << "1\n";
    
      CosNaming::NamingContext_var rootContext;
    	cout << "2\n";
    
      try {
    	cout << "3\n";
        // Obtain a reference to the root context of the Name service:
        CORBA::Object_var obj;
    	cout << "3.1\n";
        obj = orb->resolve_initial_references("NameService");
    
    	cout << "3.2\n";
        // Narrow the reference returned.
        rootContext = CosNaming::NamingContext::_narrow(obj);
    	cout << "3.3\n";
        if( CORBA::is_nil(rootContext) ) {
          cerr << "Failed to narrow the root naming context." << endl;
    	cout << "3.4\n";
          return 0;
        }
      }
      catch(CORBA::ORB::InvalidName& ex) {
    	cout << "4\n";
        // This should not happen!
        cerr << "Service required is invalid [does not exist]: " 
          // marche pas avec omniorb: << ex << endl
          ;
        return 0;
      }
    
    	cout << "5\n";
      try {
        // Bind a context called "test" to the root context:
    
        CosNaming::Name contextName;
        contextName.length(1);
        contextName[0].id   = (const char*) "test";       // string copied
        contextName[0].kind = (const char*) "my_context"; // string copied
        // Note on kind: The kind field is used to indicate the type
        // of the object. This is to avoid conventions such as that used
        // by files (name.type -- e.g. test.ps = postscript etc.)
    
        CosNaming::NamingContext_var testContext;
        try {
          // Bind the context to root.
          testContext = rootContext->bind_new_context(contextName);
        }
        catch(CosNaming::NamingContext::AlreadyBound& ex) {
          // If the context already exists, this exception will be raised.
          // In this case, just resolve the name and assign testContext
          // to the object returned:
          CORBA::Object_var obj;
          obj = rootContext->resolve(contextName);
          testContext = CosNaming::NamingContext::_narrow(obj);
          if( CORBA::is_nil(testContext) ) {
            cerr << "Failed to narrow naming context." << endl;
            return 0;
          }
        }
    
        // Bind objref with name Arbitre to the testContext:
        CosNaming::Name objectName;
        objectName.length(1);
        objectName[0].id   = (const char*) "Arbitre";   // string copied
        objectName[0].kind = (const char*) "Object"; // string copied
    
        try {
          testContext->bind(objectName, objref);
        }
        catch(CosNaming::NamingContext::AlreadyBound& ex) {
          testContext->rebind(objectName, objref);
        }
        // Note: Using rebind() will overwrite any Object previously bound
        //       to /test/Arbitre with obj.
        //       Alternatively, bind() can be used, which will raise a
        //       CosNaming::NamingContext::AlreadyBound exception if the name
        //       supplied is already bound to an object.
    
        // Amendment: When using OrbixNames, it is necessary to first try bind
        // and then rebind, as rebind on it's own will throw a NotFoundexception if
        // the Name has not already been bound. [This is incorrect behaviour -
        // it should just bind].
      }
      catch(CORBA::COMM_FAILURE& ex) {
        cerr << "Caught system exception COMM_FAILURE -- unable to contact the "
             << "naming service." << endl;
        return 0;
      }
      catch(CORBA::SystemException&) {
        cerr << "Caught a CORBA::SystemException while using the naming service."
         << endl;
        return 0;
      }
    
      return 1;
    }
    L'execution du code ci-dessus donne le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ORB initialization                       [ ok ]
    Server création                          [ ok ]
    POA initialization                       [ ok ]
    Server POA registration                  [ ok ]
    1
    2
    3
    3.1
    Caught CORBA::SystemException.
    J'essaye d'exécuter mon code sur une seule machine ubuntu. C'est peut-être un firewall, mais je ne sait pas comment vérifier.
    Vous pensez que mon NameService est correctement lancé ? Est-ce que je doi jouer avec les arguments pour préciser que je suis en localhost ? Voici comment je l'ai lancé :

    ma commande : /usr/local/bin/omniNames -start -logdir ~/OMNINAMES_LOGDIR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fri Feb 20 11:59:22 2009:
    
    Starting omniNames for the first time.
    Wrote initial log file.
    Read log file successfully.
    Root context is IOR:010000002b00000049444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000010000000000000070000000010102000c0000003137322e31362e352e343900f90a00000b0000004e616d6553657276696365000300000000000000080000000100000000545441010000001c0000000100000001000100010000000100010509010100010000000901010003545441080000000a8d9e4901003865
    Checkpointing Phase 1: Prepare.
    Checkpointing Phase 2: Commit.
    Checkpointing completed.
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  2. #2
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Pour ceux que ca interesse :

    J'ai résolu le problème en spécifiant le Nameservice lors de l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clear; ./client -ORBInitRef NameService=IOR:010000002b00000049444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000010000000000000070000000010102000c0000003137322e31362e352e343900f90a00000b0000004e616d6553657276696365000300000000000000080000000100000000545441010000001c00000001000000010001000100000001000105090101000100000009010100035454410800000000b89e4901004af0
    Et j'ai précisé le IOR dans omniORB.cfg.

    Merci quand même à tous
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  3. #3
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Encore bonjour à tous,

    Ca fonctionne avec les arguments pour préciser le IOR du NameService, mais n'y a-t-il pas moyen de faire autrement ?

    En fait, je ne comprend pas très bien pourquoi j'ai une exception quand la ligne "CORBA::Object_var obj = orb->resolve_initial_references("NameService");" est exécutée... Et comment récupérer la référence du NameService autrement qu'en passant en paramètre le IOR de celui-ci


    Merci pour vos futures et nombreuses réponses
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

  4. #4
    Membre habitué
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par Colbix Voir le message
    En fait, je ne comprend pas très bien pourquoi j'ai une exception quand la ligne "CORBA::Object_var obj = orb->resolve_initial_references("NameService");" est exécutée...
    Oui là je suis d'accord avec toi cette exception n'est pas claire, je m'attendrais plutôt à récupérer une référence d'objet nulle lorsque le NameService n'est pas configuré.

    Citation Envoyé par Colbix Voir le message
    Et comment récupérer la référence du NameService autrement qu'en passant en paramètre le IOR de celui-ci
    Il faut bien indiquer où est le NameService à ton processus, il ne peut le deviner, donc tu le configures avec un des moyens (au choix) :
    1) passer l'IOR en paramètre du processus,
    2) mettre l'IOR dans le fichier de config omniorb,
    3) lire l'IOR dans un fichier et l'affecter au NameService au début de ton programme.
    Tu as utilisé les moyens 1 et 2 (un seul suffit) , omniorb en propose peut-être d'autres.

    Par contre, et c'est ce qui t'intéresse sûrement, il existe différentes manières d'exprimer cet IOR :
    - IOR complet sous forme numérique (ce que tu utilises).
    - IOR lisible en format texte : corbaloc::<ip>:<port>/NameService
    Cette notation est pratique pour configurer les services persistant dont l'IP et le port ne changent pas (il faudra donc fixer le port dans la configuration du naming service).
    Tu remplace simplement la référence d'objet sous forme d'IOR par la référence sous forme de corbaloc.
    ex : client -ORBInitRef NameService=corbaloc::etc...

    A voir si omniorb supporte les corbaloc ou s'il a une syntaxe à lui.

    Je te conseille d'utiliser le fichier de configuration, c'est plus clair.

  5. #5
    Membre habitué Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Points : 150
    Points
    150
    Par défaut
    Merci beacoup pour ta réponse.
    J'ai une meilleur idée du fonctionnement.

    A +
    Problème résolu ? N'oubliez pas le bouton ainsi que le "Pertinent". Ça fait du bien au forum.

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

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