Eviter les threads dans un Serveur Corba ( Translate to English ) Convertir en PDF Version imprimable
Appréciation des utilisateurs: / 1
FaibleMeilleur 
Ecrit le 19-07-2008 (7071 hits) ... section Objets distribués

Si dessous est présenté une alternative à la méthode run() de l'ORB en Corba.

Problématique: la méthode run() de l’ORB permet de se placer à l’écoute des requêtes Corba (IIOP).
Mais elle est bloquante!

Exemple classique en C++:

Tip
//Si on a l'objet ORB obtenu par init
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);

// - methode 1: on place orb->run() qui est bloquant
orb -> run();

 

Comment faire des traitements en parallèle de l’ORB dans un programme serveur?

  • 1/Utiliser des Thread, par exemple JTC de Iona en C++, ou directement avec Java
  • 2/Utiliser l’alternative à run() ci dessous

L’alternative à run() :

  • boolean work_pending(): Non bloquant, indique si une requête Corba est arrivée
  • void perform_work(): Non bloquant, traite les requêtes Corba en attente

il faut utiliser le couple d'appels orb.work_pending()/orb.perform_work() qui remplacent orb.run() et qui peuvent être utilisées dans la boucle principale du programme.

mise en œuvre en C++:

Tip

 // méthode 2: on utilise orb.work_pending() qui est non bloquant
    int x=0;
    while (1) {
            cout << "je suis dans la boucle de traitement depuis «
            <<(x++)<<" secondes" << endl;

        //orb.work_pending() fonctionne de paire avec orb.perform_work()
            if ( orb->work_pending() )
                orb->perform_work();
        
          //pause 1 second (défini dans dos.h) pour éviter de bloquer le processeur
        sleep(1);
    }


 Mise en œuvre en Java:

Tip 

           int x=0;
            while (true) {
                System.out.println("je suis un client qui boucle depuis "
                                                +(x++)+" secondes");
                try {Thread.sleep(1000);} catch (Exception e){;};
               

                //methode 2: on utilise orb.work_pending() qui est non bloquant
                //orb.work_pending() fonctionne de pair avec orb.perform_work()
                if ( orb.work_pending() )
                    orb.perform_work();          
            }
 

 
Enfin, et pour information, le must est d'utiliser le service Corba "Event" ou "Notification" qui a été créé précisément pour gérer des messages asynchrones bidirectionnels.

 

 
< Précédent   Suivant >
 

Navigation
Home
Contacts
Développement
Logistique de projet
Bases de données
Systèmes
Réseaux & Télécom
Outils
Reliques
Téléchargement
Recherche
Plan du site
Administration
Agenda Online
Page cours IUT GTR
Login





Mot de passe oublié ?
Visites

Sites amis
View Nadir BOUSSOUKAIA's profile on LinkedIn
Mes photos