OVH Cloud OVH Cloud

Remoting, Event et Singleton : Pourquoi ?

8 réponses
Avatar
Gislain
Bonjour,

Je viens enfin de faire fonctionner (enfin) un objet en remoting afin qu'il
me retourne un évènement, mais je ne comprend pas pourquoi je suis obligé de
le déclarer en WellKnownObjectMode.Singleton pour que cela fonctionne.
Si j'enregistre mon object en WellKnownObjectMode.SingleCall les évènements
ne sont pas remontés à l'appelant.

Quelqu'un peut-il m'expliquer pourqoui ?

PS : je me suis basé sur l'exemple de Cohen Shwartz Oren
URL : http://www.codeproject.com/csharp/PathRemotingArticle.asp

Merci d'avance d'eclairer ma lenterne...

Gislain.

8 réponses

Avatar
Gislain
PS : Je cherche donc le moyen d'avoir un objet en SingleCall qui puisse
renvoyer les evt car plusieurs clients doivent pouvoir lancer le même
traitement sur le serveur et être informés lorsque le process est terminé.

Comment faire .. ??? ....

Gislain.


"Gislain" wrote in message
news:
Bonjour,

Je viens enfin de faire fonctionner (enfin) un objet en remoting afin


qu'il
me retourne un évènement, mais je ne comprend pas pourquoi je suis obligé


de
le déclarer en WellKnownObjectMode.Singleton pour que cela fonctionne.
Si j'enregistre mon object en WellKnownObjectMode.SingleCall les


évènements
ne sont pas remontés à l'appelant.

Quelqu'un peut-il m'expliquer pourqoui ?

PS : je me suis basé sur l'exemple de Cohen Shwartz Oren
URL : http://www.codeproject.com/csharp/PathRemotingArticle.asp

Merci d'avance d'eclairer ma lenterne...

Gislain.




Avatar
Elp
On Sat, 27 Nov 2004 08:49:03 +0100, Gislain wrote:

Bonjour,



Salut,

Je viens enfin de faire fonctionner (enfin) un objet en remoting afin qu'il
me retourne un évènement, mais je ne comprend pas pourquoi je suis obligé de
le déclarer en WellKnownObjectMode.Singleton pour que cela fonctionne.
Si j'enregistre mon object en WellKnownObjectMode.SingleCall les évènements
ne sont pas remontés à l'appelant.

Quelqu'un peut-il m'expliquer pourqoui ?



J'imagine que c'est a cause du fait qu'un objet single call n'est utilisé
qu'une fois puis détruit.

Plus clairement: lorsque tu expose un objet en single call et qu'un client
appele une méthode de cet objet, le framework crée une instance de cet
objet, execute la méthode demandée puis détruit l'objet. C'est le principe
du single call. Il n'y a pas persistence de l'état de l'objet. Ca
fonctionne en fait exactement comme une méthode d'un service web ou comme
une page web. Le serveur ne se souvient pas de ce qu'il c'est passé avant,
il exécute les methodes a la demande puis oublie tout. C'est sans doute
pour cela que si un client s'inscrit a un évenement de ton object single
call, l'évenement n'est jamais levé car l'object distant est immédiatement
détruit.

Si ton objet est singleton, alors la, c'est différent. Un objet singleton
est instancié la premiere fois qu'un client appelle une de ses méthodes.
Puis il reste en mémoire (techniquement parlant on va dire qu'il y a
persistance de l'état de l'object). A chaque fois que le client, ou un
autre client, appele une méthode de cet object, elle est executée sur ce
meme object. Tout les client ont donc accés a la meme instance de ton
object. Cet object ne sera détruit qu'une fois son "lease" (durée de vie,
fixée par défaut a 5 minutes) aura expiré. Si des client s'inscrivent a un
évenement de cet object, ils le recevront tant que cet objet n'aura pas été
détruit (donc gaffe a la durée de vie de ton object, c'est souvent une
source de bugs incompréhensibles pour les débutant en .NET Remoting).
Avatar
Elp
On Sat, 27 Nov 2004 10:37:51 +0100, Gislain wrote:

PS : Je cherche donc le moyen d'avoir un objet en SingleCall qui puisse
renvoyer les evt car plusieurs clients doivent pouvoir lancer le même
traitement sur le serveur et être informés lorsque le process est terminé.

Comment faire .. ??? ....



Si le traitement ne prends pas des heures, tu pourrai rendre ta méthode
synchrone (elle ne retourne que lorsque le traitement est terminé) et
régler le time out du coté client de maniere appropriée. Tres mauvaise idée
j'imagine cela dit car pour peut que le traitement soit un peu trop long ou
qu'il y ai beaucoup de requete, ton serveur va tomber tres rapidement
(chaque nouvelle requete est effectué dans un nouveau thread du thread pool
qui ne peux exécuter que 25 thread en meme temps. Et ce thread pool est
utilisé par le framework pour faire d'autre choses aussi donc tu imagine ce
qui va se passer si tu le monopolise).

Autre solution, avoir un object singleton qui ai la fonction d'"object
factory". Cet objet contiendrai une méthode GetRemoteObject par exemple qui
crérai un nouvelle instance de l'objet qui fait le travail et le
retournerai au client. Du coup, chaque client aurai son propre objet
singleton. Pas trop sur que ca marche, je ne suis pas un spécialsite et je
n'ai jamais essayé mais a priori ca devrait. Toujours faire gaffe au lease
bien sur.
Avatar
Gislain
Merci Elp pour tes 2 messages

Sachant que je suis effectivement un débutant en .Net Remoting, cela me
laisse présager de nombreuses heures de reflexions pour la suite.
Merci pour tes explications.

Gislain.

"Elp" wrote in message
news:
On Sat, 27 Nov 2004 08:49:03 +0100, Gislain wrote:

> Bonjour,

Salut,

> Je viens enfin de faire fonctionner (enfin) un objet en remoting afin


qu'il
> me retourne un évènement, mais je ne comprend pas pourquoi je suis


obligé de
> le déclarer en WellKnownObjectMode.Singleton pour que cela fonctionne.
> Si j'enregistre mon object en WellKnownObjectMode.SingleCall les


évènements
> ne sont pas remontés à l'appelant.
>
> Quelqu'un peut-il m'expliquer pourqoui ?

J'imagine que c'est a cause du fait qu'un objet single call n'est utilisé
qu'une fois puis détruit.

Plus clairement: lorsque tu expose un objet en single call et qu'un client
appele une méthode de cet objet, le framework crée une instance de cet
objet, execute la méthode demandée puis détruit l'objet. C'est le principe
du single call. Il n'y a pas persistence de l'état de l'objet. Ca
fonctionne en fait exactement comme une méthode d'un service web ou comme
une page web. Le serveur ne se souvient pas de ce qu'il c'est passé avant,
il exécute les methodes a la demande puis oublie tout. C'est sans doute
pour cela que si un client s'inscrit a un évenement de ton object single
call, l'évenement n'est jamais levé car l'object distant est immédiatement
détruit.

Si ton objet est singleton, alors la, c'est différent. Un objet singleton
est instancié la premiere fois qu'un client appelle une de ses méthodes.
Puis il reste en mémoire (techniquement parlant on va dire qu'il y a
persistance de l'état de l'object). A chaque fois que le client, ou un
autre client, appele une méthode de cet object, elle est executée sur ce
meme object. Tout les client ont donc accés a la meme instance de ton
object. Cet object ne sera détruit qu'une fois son "lease" (durée de vie,
fixée par défaut a 5 minutes) aura expiré. Si des client s'inscrivent a un
évenement de cet object, ils le recevront tant que cet objet n'aura pas


été
détruit (donc gaffe a la durée de vie de ton object, c'est souvent une
source de bugs incompréhensibles pour les débutant en .NET Remoting).


Avatar
Elp
On Sat, 27 Nov 2004 18:30:23 +0100, Gislain wrote:

Merci Elp pour tes 2 messages

Sachant que je suis effectivement un débutant en .Net Remoting, cela me
laisse présager de nombreuses heures de reflexions pour la suite.
Merci pour tes explications.



.NET Remoting est tres simple a utiliser (enfin a partir du moment que tu
cherche a faire des choses pas trop pointues bien sur) mais peux devenir
une horreur si tu te lance dedans tete baissée sans prendre le temps
d'acquérir les bases (c'est comme tout, rien n'set magique...). Donc, lit
la doc, comprends bien tout ce qui se passe dans les exemples simples qui
fourmillent sur le Web et si tu lit l'anglais et que .NET Remoting est
important pour ton projet, achete cet excellent bouquin: Advanced .NET
Remoting par Ingo Rammer (il y a une edition VB et une C#). Malgré son
titre il est aussi bien adapté aux parfaits débutants qu'aux utilisateurs
avancés et surtout tres clair et bien illustré (d'exemples pas d'images
bien sur:-). Le site web de l'auteur est une bonne source d'infos
également: http://www.thinktecture.com/Resources/default.html. Jette un
oeil a la faq.
Avatar
Gislain
Merci pour ces conseils.
Effectivement .Net Remoting est important pour le projet en cours (qui est
un prélable à un plus gros), et j'espère bien me faire acheter le livre en
question. Cela fait déjà quelques jours que je m'exerce avec de petits
projets... et à ce jour je ne vois pas vraiment d'autres solutions pour
faire bosser un serveur à la place d'un poste client.

Exception faite de MSMQ pour envoyer des job, mais je n'ai pas trouvé le
moyen d'informer le client en asynchrone que le job était terminé (d'une
manière simple et clean).
Est-ce possible, au même titre que les évènements en .Net Remoting ?

A+

Gislain.


"Elp" wrote in message
news:1bw4cvklqc4gd$
On Sat, 27 Nov 2004 18:30:23 +0100, Gislain wrote:

> Merci Elp pour tes 2 messages
>
> Sachant que je suis effectivement un débutant en .Net Remoting, cela me
> laisse présager de nombreuses heures de reflexions pour la suite.
> Merci pour tes explications.

.NET Remoting est tres simple a utiliser (enfin a partir du moment que tu
cherche a faire des choses pas trop pointues bien sur) mais peux devenir
une horreur si tu te lance dedans tete baissée sans prendre le temps
d'acquérir les bases (c'est comme tout, rien n'set magique...). Donc, lit
la doc, comprends bien tout ce qui se passe dans les exemples simples qui
fourmillent sur le Web et si tu lit l'anglais et que .NET Remoting est
important pour ton projet, achete cet excellent bouquin: Advanced .NET
Remoting par Ingo Rammer (il y a une edition VB et une C#). Malgré son
titre il est aussi bien adapté aux parfaits débutants qu'aux utilisateurs
avancés et surtout tres clair et bien illustré (d'exemples pas d'images
bien sur:-). Le site web de l'auteur est une bonne source d'infos
également: http://www.thinktecture.com/Resources/default.html. Jette un
oeil a la faq.


Avatar
Elp
On Sun, 28 Nov 2004 10:28:56 +0100, Gislain wrote:

Exception faite de MSMQ pour envoyer des job, mais je n'ai pas trouvé le
moyen d'informer le client en asynchrone que le job était terminé (d'une
manière simple et clean).
Est-ce possible, au même titre que les évènements en .Net Remoting ?



Aucune idée, je ne connais pas MSMQ. Je suis un peu étonné que personne
d'autre n'ai répondu a ton post original car je suis sur que d'autre ici
doivent avoir de meilleures idée pour résoudre ton probleme. En tout cas,
pour toutes les questions .NET Remoting, tu peux tenter ta chance ici:
microsoft.public.dotnet.framework.remoting
Ils y a d'excellents contributeurs sur ce forum et c'est sans doute la que
tu trouvera la meilleure solution pour ton probleme.

a+
Avatar
Gislain
Merci pour le forum.

PS : Concernant le nb de réponses, je crois que nous "étions" en W.E. ...

a+

Gislain.

"Elp" wrote in message
news:1lutrh08r2lqd$
On Sun, 28 Nov 2004 10:28:56 +0100, Gislain wrote:

> Exception faite de MSMQ pour envoyer des job, mais je n'ai pas trouvé le
> moyen d'informer le client en asynchrone que le job était terminé (d'une
> manière simple et clean).
> Est-ce possible, au même titre que les évènements en .Net Remoting ?

Aucune idée, je ne connais pas MSMQ. Je suis un peu étonné que personne
d'autre n'ai répondu a ton post original car je suis sur que d'autre ici
doivent avoir de meilleures idée pour résoudre ton probleme. En tout cas,
pour toutes les questions .NET Remoting, tu peux tenter ta chance ici:
microsoft.public.dotnet.framework.remoting
Ils y a d'excellents contributeurs sur ce forum et c'est sans doute la que
tu trouvera la meilleure solution pour ton probleme.

a+