500 likes | 622 Vues
Développer avec ORBacus. Partie 1 – Les préalables. Préalables. Effectuer une analyse de type « Orienté objets » (UML, OMT, etc.); Configurer le IDE correctement (Visual Studio, etc.). La distribution ORBacus. ORBacus est distribué en code source C++;
E N D
Développer avec ORBacus Partie 1 – Les préalables
Préalables • Effectuer une analyse de type « Orienté objets » (UML, OMT, etc.); • Configurer le IDE correctement (Visual Studio, etc.).
La distribution ORBacus • ORBacus est distribué en code source C++; • Possibilité de le compiler avec information de débogage ou optimisé; • Les deux compilations sont misent à votre disposition.
La distribution ORBacus • La distribution comporte 5 sous-répertoires: • /bin contient les utilitaires tel les traducteurs IDL et les installateurs de services; • /demo contient des projets C++ démontrant les utilisations diverses du ORB; • /idl contient les interfaces IDL de l’ORB ainsi que les interfaces des services; • /include contient les en-têtes CORBA et les en-têtes des services; • /lib contient les librairies de débogage et optimisées du ORB.
La distribution ORBacus • Les exécutables binaire importants (/bin):
La distribution ORBacus • Les exécutables binaire importants (/bin):
La distribution ORBacus • Les librairies importantes (/lib):
La distribution ORBacus • Les en-têtes importantes (/include):
La configuration de ORBacus • Le ORB et ses services peuvent être configuré de plusieurs façons: • Fichier de configuration à l’aide de l’utilitaire regupdate, incontournable et pratique pour configuration statique; • Modifier manuellement les registres Windows avec les clés nécessaires (tout en respectant la hiérarchie imposé par le ORB), pas très convivial ni pratique, à éviter; • Au niveau de la programmation à l’aide du service propriétés, pratique pour configuration propice au changement. (Prioritaire sur les autres, annule les autres modes).
La configuration de ORBacus • Fichier de configuration - partie ORB et adaptateur d’objets (OA): ooc.orb.server_timeout=20 ooc.orb.client_timeout=20 ooc.orb.client_shutdown_timeout=10 ooc.orb.server_shutdown_timeout=10 ooc.orb.conc_model=threaded ooc.orb.oa.endpoint=iiop --host 127.0.0.1 --port 5000 ooc.orb.oa.conc_model=thread_pool ooc.orb.oa.thread_pool=5
La configuration de ORBacus • Fichier de configuration - partie services: ooc.orb.service.NameService=corbaloc::hôteservice:5001/NameService ooc.orb.service.TradingService=corbaloc::hôteservice:5002/TradingService ooc.orb.service.PropertyService=corbaloc::hôteservice:5003/ PropertyService
La configuration de ORBacus • Pour officialiser la configuration du fichier, utilisez regupdate.exe afin de mettre à jour les registres Windows; • regupdate HKEY_LOCAL_MACHINE maconfig.txt va inscrire les clés nécessaire dans HKEY_LOCAL_MACHINE/SOFTWARE/OOC/ • Vous pouvez aussi modifier les registres manuellement; • Vous pouvez aussi utiliser le services propriétés, utilisant le même format de chaîne que le fichier. Toute configuration au niveau du code va surpasser celle inscrite aux registres!
La configuration de ORBacus • Résultat d’un regupdate sur les registres: ooc.orb • Référez-vous au chap. 4 du manuel ORBacus pour la liste complète des propriétés
La configuration de ORBacus • Certains services sont disponibles en tant que service natif Windows NT/2000, d’autres non; • Pour installer un services NT, utiliser la ligne de commande ntservice -i, le service sera ajouter au services Windows, vous pourrez ainsi lui spécifier de démarrer automatiquement ou manuellement; • Les autres doivent être démarrés par ligne de commande a chaque redémarrage du système ou automatiquement exécutés.
Démarrer un projet • Le démarrage d’un projet en C++ requiert quelques configurations au niveau de l’environnement; • ORBacus n’a été testé sous Windows que pour Visual C++ 6.0 et .NET 2003.
Démarrer un projet VC++ 6.0 • File / New / Win32 Console Application.
Démarrer un projet VC++ 6.0 • Tools / Options / Directories
Démarrer un projet VC++ 6.0 • Project / Settings
Démarrer un projet VS.NET • File / New / Project
Démarrer un projet VS.NET • Tools / Options / Project / VC++ Directories
Démarrer un projet VS.NET • Project / Properties / C/C++
Démarrer un projet VS.NET • Project / Properties / Linker
Démarrer un projet • L’environnement de développement est maintenant configuré correctement;
Développer avec ORBacus Partie 2 – Hello World avec C++
1) Les interfaces IDL • La première étape du développement consiste à définir les interfaces IDL; • Considérons l’application Hello World dont l’objet offrira 2 méthodes: • Dire allo côté serveur; • Fermer le serveur à distance.
1) Les interfaces IDL interface Hello //nom de l’interface { void say_hello(); //Méthode dire allo void shutdown(); //Fermer le serveur }; • Une méthode peut retourner une valeur; • Une méthode peut retourner un type complexe de données.
2) Générer les stubs et squelettes • Un ORB offre toujours une application par ligne de commande pour traduire nos interface IDL en un langage supporté de notre choix; • Nous utilisons ici ORBacus avec C++ dont le traducteur IDL est idl.exe dans le répertoire /bin de la distribution: • idl Hello.idl
2) Générer les stubs et squelettes • Cette commande génère plusieurs fichiers: • Hello.h • Hello.cpp; • Hello_skel.h • Hello_skel.cpp; • Vous devrez ajouter 2 fichiers qui contiennent l’implantation de votre objet: • Hello_impl.h • Hello_impl.cpp
2) Générer les stubs et squelettes • Hello est la classe de base définissant l’objet CORBA Hello ainsi que ses références nécessaires. • C’est le stub typique tel que définit. • Précise l’interface de l’objet et ses types de données au bus CORBA; • Aucune modification à apporter manuellement.
2) Générer les stubs et squelettes • Hello_skel est le squelette de notre objet Hello. • C’est ce qui nous permettra de trouver notre objet sur le bus CORBA (POA ou BOA). • Aucunes modifications à apporter manuellement.
3) Implémenter nos objets • Vous devez créer Hello_impl.cpp et Hello_impl.h qui contiennent l’implantation de l’objet Hello;
3) Implémenter nos objets • Hello_impl.h
3) Implémenter nos objets • Hello_impl.cpp
3) Implémenter nos objets • Garder dans l’optique que tout le traitement sera effectuer côté serveur; • Par exemple si vous accédez à une base de données, c’est le serveur qui lui accèdera et jamais votre client. Ce dernier va simplement recevoir les résultats du traitement via le bus; • Une méthode peut retourner une valeur ou une structure de données.
4) Architecture d’un serveur • Un serveur doit inclure tous les fichiers générés par la traduction de/des interfaces: • Le stub; • Le squelette; • L’implémentation. • Le fichier serveur.cpp à été créé manuellement afin de contenir la fonction main().
4) Architecture d’un serveur • Le fichier serveur.cpp possède 2 fonctions: • int main(int argc, char* argv[], char*[]); • int run(CORBA::ORB_ptr orb, int argc, char* argv[]); • La fonction main() est le point d’entré au programme. Elle initialise le ORB et ses propriétés. L’implémentation est activée par un appel à la fonction run(); • La fonction run() est l’initialisation des fonctionnalités désirées pour l’implémentation de notre ORB;
4) Architecture d’un serveur • Initialisation et exécution du ORB dans main():
4) Architecture d’un serveur • La fonction run() effectue l’implémentation du type de serveur désiré tel: • Obtenir la référence du POA racine du ORB; • Créer POA persistant pour notre objet Hello; • Obtenir la référence du Boot Manager; • Initialiser l’implémentation de notre objet Hello sur le POA avec un identificateur permettant au client de trouver l’objet; • Exécuter l’implémentation du ORB.
4) Architecture d’un serveur • Obtenir référence du POA racine • Créer POA persistant pour l’objet Hello
4) Architecture d’un serveur • Obtenir référence du Boot Manager • Instancier nos objets sur le bus • Exécuter l’implémentation
5) Architecture d’un client • Un client doit inclure seulement les stubs des objets qu’il désire utiliser. • Le fichier client.cpp a été créé manuellement afin de contenir la fonction main().
5) Architecture d’un client • Le fichier client.cpp possède 2 fonctions: • int main(int argc, char* argv[], char*[]) • int run(CORBA::ORB_ptr orb, const char* host, const char* port, int argc, char* argv[]) • La fonction main() est le point d’entré au programme. Elle initialise le ORB et ses propriétés. L’implémentation est activé par un appel à la fonction run(); • La fonction run() détermine le POA racine et retrouve l’objet Hello sur le bus par URL. Elle contient aussi la boucle principale pour les entrées de l’utilisateur;
5) Architecture d’un client • Initialisation des propriétés et exécution du ORB dans main(): • Host et port ont été obtenu de l’utilisateur…
5) Architecture d’un client • La fonction run() effectue les opérations suivante pour le client: • Détermine le POA racine; • Trouve l’objet Hello sur le bus par URL Corbaloc; • Instancie un objet Hello; • Appelle les méthodes de l’objet à la demande de l’utilisateur.
5) Architecture d’un client • Obtenir référence du POA racine • Trouver l’objet Hello et l’instancier: Le URL pour retrouver notre objet Hello:Corbaloc::1.2@127.0.0.1:1234/Hello
5) Architecture d’un client • Boucle d’interaction avec l’utilisateur:
Destruction du ORB • Dans le main() du client ET du serveur.
Note • Une fois compiler avec la distribution optimisée, les applications peuvent être exécuter sur n’importe quelle machine du même OS sans les librairies.
Référence • http://www.orbacus.com/support/new_site/support/manual.jsp