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 :

Problème de reqûètes multiples (asynchrone/synchrone).


Sujet :

CORBA

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 0
    Points : 314
    Points
    314
    Par défaut Problème de reqûètes multiples (asynchrone/synchrone).
    Problème :
    A la suite d'un envoi de message asynchrone, d'un objet client C à un objet servant S, toutes les autres requêtes synchrones du client C au servant S sont bloquantes, attendant la fin du précèdent traitement pour servir le nouveau.

    Question :
    Travaillant avec omniORB, comment permettre au client C de pouvoir continuer à être servi (sur d'autres requêtes) par le servant S, alors que ce dernier traite encore le message asynchrone ?

    Merci,
    Valdo


    ---
    ivaldo@ifrance.com

  2. #2
    Membre averti
    Avatar de knotty
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 391
    Points
    391
    Par défaut
    Verifie les specs de OmniORB. Soit il est multithreade, et alors tu peux.
    Soit (c'est mon feeling), il ne l'est pas et alors t'es mort.

    MICO a une version de developpement qui est multithreadee (et gratuite).
    Orbacus l'est (payant).

    Autre soluce, lourde c'est vrai, debrouille toi pour que les appels a la fonction soit tres courts, ca resoudra plus ou moins le probleme, apres ca, t'as plus qu'a faire gaffe a ton code pour qu'il soit comme on dit "thread-safe".

    Bonne chance.
    Christophe Ludet
    Testez vos connaissances Java - http://knotty.developpez.com
    Donner des ailes a votre application (J2EE patterns) - http://knotty.developpez.com/j2ee

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Quelques remarques sur ma question...
    Remarques:
    (1) omniOrb est bien multithread et les politsys semblent bien configures.
    (2) de plus, ce probleme ne ce rencontre pas si le servant repond a deux clients. En effet, si un client fait une requete asynchronne a un servant et qu'un autre client fait alors des requetes synchronne sur le meme servant, ce dernier client est servi normalement, meme si le traitement asynchronne n'est pas encore fini... Bizard, non ???

    Valdo.

  4. #4
    Membre averti
    Avatar de knotty
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 391
    Points
    391
    Par défaut
    Pour etre sur que je comprends bien, si deux clients sont separes, le servant a l'air multithreade, si c'est le meme client, alors la, ca a l'air de bloquer.

    Le client C, il est multithreade? En d'autres mots, quand C fait une requete, comment s'y prend-il pour faire une seconde requete en meme temps?

    D'autre part, je ne comprend pas bien ce que tu entends par
    "
    meme si le traitement asynchronne n'est pas encore fini..
    "

    Soit une fonction partagee sur servant S
    remoteWait(int n);

    Qui ne fait rien d'autre qu'attendre pendant n secondes.
    ex:
    remoteWait(int n) {
    pause(n * 1000);
    }

    Soit 2 clients, A et B
    A fait:
    S.remoteWait(200);
    // print ("A fini")

    en meme temps, mais en demarrant un peu apres A, B fait
    S.remoteWait(5);
    // print("B fini")


    Qui finit le premier?
    Si B fini premier, alors c'est multithreade, sinon, ca ne l'est pas.

    si tu peux essayer d'utiliser le meme pseudo langage pour m'expliquer de facon simple ce qui ne fonctionne pas, j'essaierai de t'aider.

    Bonne chance.
    Christophe Ludet
    Testez vos connaissances Java - http://knotty.developpez.com
    Donner des ailes a votre application (J2EE patterns) - http://knotty.developpez.com/j2ee

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par knotty
    Pour etre sur que je comprends bien, si deux clients sont separes, le servant a l'air multithreade, si c'est le meme client, alors la, ca a l'air de bloquer.
    OUI !

    Citation Envoyé par knotty
    Le client C, il est multithreade? En d'autres mots, quand C fait une requete, comment s'y prend-il pour faire une seconde requete en meme temps?
    C'est la methode active du cote servant qui est declaree asynchronne (oneaway dans son IDL). Ainsi, le client n'attend pas de reponce et continue sont traitement propre sans attendre la fin du traitement de la methode active cote servant.

    Citation Envoyé par knotty
    Soit une fonction partagee sur servant S
    remoteWait(int n);

    Qui ne fait rien d'autre qu'attendre pendant n secondes.
    ex:
    remoteWait(int n) {
    pause(n * 1000);
    }

    Soit 2 clients, A et B
    A fait:
    S.remoteWait(200);
    // print ("A fini")

    en meme temps, mais en demarrant un peu apres A, B fait
    S.remoteWait(5);
    // print("B fini")


    Qui finit le premier?
    Si B fini premier, alors c'est multithreade, sinon, ca ne l'est pas.
    En fait, dans mon cas, l'evoi du message remoteWait() corespond a une methode oneaway du servant. Les affichages n'attendent donc pas la fin des 200 et 5 unite demande. Ils se font dans le mouvement, alors que de son cote le servant S exicute normalement sa methode remoteWait()... En d'autre termes, ni le client C, ni le client B n'attendront la fin du traitement de la methode remoteWait() cote servant.

    Cependant si le client C enchainait par une nouvelle requete (synchrone), cette derniere ne serait traitee qu'apres les 200 unite demande. Alors que si le client B faisait une requete (synchrone) sur le servant S, a la place de S.remoteWait(5), sa requete serait directement servie, meme si les 200 unite demande par le client C n'etaient pas encore epuise.


    Je me pose alors une question :
    Chaque client d'un servant n'aurait-il pas SA propre files d'attente ? (independent des autres clients).


    Sorry, je n'arrive pas a etre beaucoup plus claire...


    Encore merci,
    Valdo.

  6. #6
    Membre averti
    Avatar de knotty
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 391
    Points
    391
    Par défaut
    Drole d'histoire ...

    La question que je me pose,
    Suppose la methode sur S

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int fact(int n) {
     // fait une pause de n secondes.
     // imprime le resultat factoriel de n
    }
    Si le client A appel la fonction S,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     S.fact(50);
     // print("fact commencee!")
    Dans ce cas la, un seul client, un seul serveur, qui affiche le resultat le premier, S affiche fact(50) ou A affiche "fact commencee" ?

    Si j'en crois ce que tu me dis, A devrais afficher le resultat le premier.

    C'est ca?
    Christophe Ludet
    Testez vos connaissances Java - http://knotty.developpez.com
    Donner des ailes a votre application (J2EE patterns) - http://knotty.developpez.com/j2ee

  7. #7
    Membre averti

    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    0
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 0
    Points : 314
    Points
    314
    Par défaut
    Citation Envoyé par knotty
    Drole d'histoire ...
    Je ne te le fais pas dire.

    Citation Envoyé par knotty
    ...

    Si j'en crois ce que tu me dis, A devrais afficher le resultat le premier.

    C'est ca?
    C'est ca, pour une interface IDL qui serait (par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    interface Servant {
    
      oneaway void fact(in long n);
    }

    Une idee ???

Discussions similaires

  1. Problème d'inclusions multiples
    Par Le Furet dans le forum C
    Réponses: 2
    Dernier message: 04/10/2005, 00h59
  2. Réponses: 22
    Dernier message: 05/07/2005, 01h04
  3. Problème de MouseListener multiples
    Par pierre.zelb dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 23/06/2005, 12h18
  4. Appel Asynchrone/Synchrone
    Par Dry dans le forum CORBA
    Réponses: 3
    Dernier message: 26/04/2005, 21h43
  5. Problème d'ajout multiples dans un BDD Access
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/05/2004, 14h34

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