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): idl.exeTraducteur IDL à C++; jidl.exeTraducteur IDL à Java; hidl.exeTraducteur IDL à HTML (pour documentation); regupdate.exeÉcrire une configuration au niveau des registres Windows;
La distribution ORBacus Les exécutables binaire importants (/bin): nteventservice.exeService événement pour Windows 2000/NT4 ntnameservice.exeService nommage pour Windows 2000/NT4 propserv.exeService propriétés
La distribution ORBacus Les librairies importantes (/lib): LibrairieOptimiséeDébogage ORBob.libobd.lib JTCjtc.libjtcd.lib OCIOCI_udp.libOCI_udpd.lib ÉvénementCosEvent.libCosEventd.lib NommageCosNaming.libCosNamingd.lib
La distribution ORBacus Les en-têtes importantes (/include): DescriptionEn-tête Bus CORBACORBA.h Localisation d’objets (IONA)BootManager.h Open Communication Interface (OCI)OCI.h / OCI_IIOP.h Service ÉvénementCosEvent__.h / _skel.h Service NommageCosNaming.h / _skel.h Service PropertiesProperties.h
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 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 et.NET 2003.
Démarrer un projet VC File / New / Win32 Console Application.
Démarrer un projet VC Tools / Options / Directories
Démarrer un projet VC 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:
5) Architecture d’un client Boucle d’interaction avec l’utilisateur:
Destruction du ORB Dans le main() du client ET du serveur.
Résultat
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