RMI - Java - Programmation
Marsh Posté le 08-07-2003 à 18:37:18
ReplyMarsh Posté le 08-07-2003 à 18:44:15
Cherrytree a écrit : Qu'entends par "libère" ? |
probablement pour que l'appel ne soit pas synchrone. Tu peux implémenter une file d'attente tout simple sur la forme d'une list quelconque. Ton appel de méthode RMI n'a pour but que d'ajouter une demande d'appel sur le site 2 (ensuite la méthode retourne et ton site 1 est libéré). A coté de ca, dans ton serveur 2 tu as une thread qui regarde périodiquement si il y a des demandes dans la file d'attente. Si oui elle les traite (et peut ainsi faire une demnande sur un serveur 3 qui peut avoir le meme mécanisme). Ta demande peut se faire via un objet relativement simple. Mais fait bien attention à bien spécifier toutes les infos dont tu as besoin (qui a fait la demande, comment répondre, etc)
Si c'est pas clair n'hésite pas
Marsh Posté le 08-07-2003 à 18:44:25
je m'explique..
j'ai 3 site.
les 3 site se font des appels en "anneau".
1. site1 fait appel1 sur site 2
2. site2 fait appel1 sur site 3
3. site3 fait appel1 sur site 1
à ce moment j'ai un problème car mon site 1 qui devrait faire appel2 à site 2 ne fait plus rien. il est donc bloqué je suppose par le l'appel1 qu'il a fait au site2.
pour résumé ma kestion pourrait etre :
site1 fait appel1 sur site2. comment je sais que site1 a eu le retour de sa fonction et peut ainsi continuer son exécution (pour attendre d'autre appels)
est-ce plus clair ?
Marsh Posté le 08-07-2003 à 18:45:05
j'avais bien compris
Marsh Posté le 08-07-2003 à 18:53:21
darklord :
tu veut dire que dans chacunes de mes méthodes RMI je fais un traitement minimal (ajouter une requete de ce type en attente). ainsi le site n libère très vite le site n-1.
puis le site n peut faire son traitement et appeler des méthodes du site n+1 et le site n-1 peut recevoir des appels.
je dois aussi préciser que tout mes sites sont identiques, il s'agit de l'implémentations d'un algorithme d'élection en anneaux.
Marsh Posté le 08-07-2003 à 19:06:15
pifou_234 a écrit : darklord : |
oui c'est ce que je veux dire. Tu peux meme introduire la notion de priorité si tu veux en faisant des classes de requete et en implémentant un scheduleur simple (comme Weigthed Round Robin par exemple)
Marsh Posté le 08-07-2003 à 19:41:03
ReplyMarsh Posté le 08-07-2003 à 21:12:14
benou a écrit : attend, y a du call-back en RMI !!! |
bin je sais et alors
Edit: explique où tu veux en venir stp
Marsh Posté le 08-07-2003 à 21:21:47
y'a du call back oui..
mais si un appel a site 1 engendre un appel à site 2 qui engendre un appel à site 3 qui engendre un appel à site 1, ben le site un restera en attente du retour de son appel si comme dans mon cas les méthodes sont synchronized
Marsh Posté le 08-07-2003 à 21:30:47
pifou_234 a écrit : dans mon cas les méthodes sont synchronized |
ca mieux en le disant
je peux pas deviner
Marsh Posté le 08-07-2003 à 21:31:19
DarkLord a écrit : |
ben là : que si elles avaient pas été synchronizées, y aurait pas eu de problème ...
Marsh Posté le 08-07-2003 à 21:56:11
benou a écrit : |
excuse moi... c'est vrai que c'est un détail important
Marsh Posté le 08-07-2003 à 22:06:19
pifou_234 a écrit : |
bha c'est pas grave, mais du coup faut que tu passes par la méthode de dark
Marsh Posté le 09-07-2003 à 13:16:35
Question bete...
Pourquoi synchroniser si tu veux traiter d'autres requetes (les forcer meme) ?
Ca me semble scabreux ton truc et ca sent le probleme de conception a plein nez (a moins que tu ne justifie la chose, mais intuitivement je dirais qu'il y a un probleme)
Marsh Posté le 09-07-2003 à 13:30:47
Utilise un vrai anneau :
node1 -> node2 -> node3 -> node4 -> node1
Si node1 veux envoyer un msg a node3 il passe par node2, et recoit la reponse par node4.
Chaque message sur l'anneau est associe a un tag T1 avec une valeur numerique cree a l'envoi du message ainsi que l'id du noeud.
Le noeud faisant l'appel de methode (message) map ce tag T1 a un tag identique local T1' (meme valeur) sur lequel le thread de la methode appelante wait lors de l'envoi du message.
Chaque noeud, lorsqu'il recoit un message verifie si le message lui est destine.
Si oui soit c'est un appel de methode. Si le noeud est le noeud destinataire l'appel est execute, puis le tag T1 est modifie pour le transformer en ACK puis est transfere dans le message de retour et renvoye sur l'anneau au noeud suivant.
Soit c'est un message de retour. Dans ce cas, le tag est extrait le systeme retrouve le tag local dans la map (via sa vlaeur numerique) et fait un notify.
etc... je te laisse peaufiner l'anneau
Marsh Posté le 09-07-2003 à 13:36:54
Note : pour avoir des appels asynchrones, soit tu crees ta propre classe de connection (ca fait 2 ans que je n'ai plus jete un oeil a RMI) soit tu fais les appels au noeud suivant dans un nouveau Thread et tu fais en sorte que tes methodes soient toutes void.
Enfin bref : RMI ne me semble pas du tout adapte a ce genre d'utilisation
Marsh Posté le 08-07-2003 à 18:35:43
salut à tous,
petite kestion pour le gens qui s'y connaissent en rmi.
je dois faire une application qui est en meme temps serveur rmi et ki fait des appels RMI sur d'autres site.
le site 1 fait un appel au site 2, le site fait un appel au site 3. comment faire pour que le site 2 libère le site 1 car celui ci devra répondre a d'autres appels d'autres sites...
merci pour votre aide et A+