Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3033 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

(Simple)DateFormat et synchronisation

n°845749
benou
Posté le 09-09-2004 à 11:15:58  profilanswer
 

Reprise du message précédent :


il n'y a pas de honte à ne pas savoir, il n'y a que honte à ne pas apprendre :o
 
je savais que ca permettait ce genre de truc, mais je pensais pas que c'était comme ca que ca s'utilisait ... c'est assez spécial...
Faudra que je me lise de la doc là dessus ...


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le 09-09-2004 à 11:15:58  profilanswer
 

n°845769
the real m​oins moins
Posté le 09-09-2004 à 11:28:56  profilanswer
 

[:icon12]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°845802
uriel
blood pt.2
Posté le 09-09-2004 à 11:59:19  profilanswer
 

j'ai jamais de multi thread :(


---------------
IVG en france
n°846226
julienv
Posté le 09-09-2004 à 17:53:19  profilanswer
 

benou a écrit :

:jap:
 
je savais pas à quoi srevait ThreadLocale ... c'est plutot intéressant ... ca ouvre des perspectives ...
je me demande comment c'est géré en interne ...


 
en fait c est une bete Map thread->object :
 
j imagine que le get est implemente commce ceci :
 
public Object get()
{
   return map.get(Thread.currentThread());
}

n°846229
julienv
Posté le 09-09-2004 à 17:57:08  profilanswer
 

Aucun danger c est safe vu que tu utilises ton ThreadLocal a toi.
 
Lors de l undeploy de l application, ta classe passe au garbage et le ThreadLocal avec.
 
Mais bon j admet que l utilisation de ThreadLocal releve souvent du hack :-)
 

the real moins moins a écrit :

haaaaan :o
 
oui c'est interessant, mais dans un contexte j2ee je suis pas sur que ça soit la chose la plus propre à faire :p

n°846277
darklord
You're welcome
Posté le 09-09-2004 à 18:55:13  profilanswer
 

the real moins moins a écrit :

haaaaan :o
 
oui c'est interessant, mais dans un contexte j2ee je suis pas sur que ça soit la chose la plus propre à faire :p


 
si si, ça change rien. Fin si ton appli n'est pas en clustering, c'est bon.


---------------
Just because you feel good does not make you right
n°846400
the real m​oins moins
Posté le 09-09-2004 à 22:43:02  profilanswer
 

qu'est-ce qui change rien? et je vois pas le rapport avec le clustering.
 
je disais juste que j'allais pas commencer a jouer avec ThreadLocal dans un session bean pour faire *ça* alors que je pouvais betement garder une instance par sb et faire gaffe à ce que je fais ou bien réinstancier le bidule à chaque fois et basta.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°846426
benou
Posté le 09-09-2004 à 23:18:40  profilanswer
 

julienv a écrit :

en fait c est une bete Map thread->object :
 
j imagine que le get est implemente commce ceci :
 
public Object get()
{
   return map.get(Thread.currentThread());
}


nan en fait, c'est encore plus con que ca : y a une Map "package protected" dans le Thread => le ThreadLocale s'enregistre directement dans cette Map.


---------------
ma vie, mon oeuvre - HomePlayer
n°846427
benou
Posté le 09-09-2004 à 23:20:03  profilanswer
 

the real moins moins a écrit :

qu'est-ce qui change rien? et je vois pas le rapport avec le clustering.
 
je disais juste que j'allais pas commencer a jouer avec ThreadLocal dans un session bean pour faire *ça* alors que je pouvais betement garder une instance par sb et faire gaffe à ce que je fais ou bien réinstancier le bidule à chaque fois et basta.


c'est calir que ca fait un peu con de "surcharger" un Thread d'un environnement J2ee pour ca ... si tout le monde fait ca, il va devenir chargé le thread :D


---------------
ma vie, mon oeuvre - HomePlayer
n°846453
the real m​oins moins
Posté le 09-09-2004 à 23:50:37  profilanswer
 

:jap: :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
mood
Publicité
Posté le 09-09-2004 à 23:50:37  profilanswer
 

n°846535
julienv
Posté le 10-09-2004 à 02:51:36  profilanswer
 

En fait, c est un HashMap donc ca ne va rien surcharger du tout vu que l acces est en constant O(1).
 
Au niveau du garbage, les entries dans la Map utilisent des weak references, donc des que l objet ThreadLocal passe au garbage, la map maintenue au niveau du thread est nettoyee.
 
C est sur que si l on traite toutes les dates au meme endroit il est inutile d utiliser ce genre de hack. Maintenant si on manipule les dates dans pleins de classes differents, cela peut etre interessant d utiliser cela.
 
La ou ca peut etre interessant est en terme d'utilisation d objets, car c est imbatable : le nombre de SimpleDateFormat crees est egal au plus au nombre de thread tournant dans la VM.
 

the real moins moins a écrit :

qu'est-ce qui change rien? et je vois pas le rapport avec le clustering.
 
je disais juste que j'allais pas commencer a jouer avec ThreadLocal dans un session bean pour faire *ça* alors que je pouvais betement garder une instance par sb et faire gaffe à ce que je fais ou bien réinstancier le bidule à chaque fois et basta.


c'est calir que ca fait un peu con de "surcharger" un Thread d'un environnement J2ee pour ca ... si tout le monde fait ca, il va devenir chargé le thread :D

n°846601
benou
Posté le 10-09-2004 à 08:52:31  profilanswer
 

julienv a écrit :

En fait, c est un HashMap donc ca ne va rien surcharger du tout vu que l acces est en constant O(1).


je voulais juste dire que si chaque classe fait ce genre de truc dans son coin, le thread allait se trainer bcp d'objet => grosse consomation mémoire ... et surtout non garbage collecte (enfin tant que le threadloclae est référencé ...


---------------
ma vie, mon oeuvre - HomePlayer
n°846812
julienv
Posté le 10-09-2004 à 12:13:53  profilanswer
 

En fait, ces objets la si tu ne les met pas dans le thread, tu les mettras ailleurs ca reviendra au meme. Maintenant si tu as besoin d'un objet SimpleDate a un moment precis c est sur que ca ne vaut pas le coup.
 
 

benou a écrit :

je voulais juste dire que si chaque classe fait ce genre de truc dans son coin, le thread allait se trainer bcp d'objet => grosse consomation mémoire ... et surtout non garbage collecte (enfin tant que le threadloclae est référencé ...

n°846965
benou
Posté le 10-09-2004 à 15:11:16  profilanswer
 

julienv a écrit :

En fait, ces objets la si tu ne les met pas dans le thread, tu les mettras ailleurs ca reviendra au meme


on est d'accord. Ce que je veux dire c'est qu'une fois qu'ils sont dans le thread, ils y sont généralement pour un moment dans un Context J2EE (dans lequel les ejb sont cachés et les threads poolés)


---------------
ma vie, mon oeuvre - HomePlayer
n°847221
d4rK 3Mpr0​R
fr33 Kevin
Posté le 10-09-2004 à 18:06:29  profilanswer
 

Je suppose que la remarque à propos du clustering de darque était la suivante : si le bean migre d'une JVM à une autre, le ThreadLocal va pas le suivre, donc ça va mal se passer.

n°847236
darklord
You're welcome
Posté le 10-09-2004 à 18:28:33  profilanswer
 

d4rK 3Mpr0R a écrit :

Je suppose que la remarque à propos du clustering de darque était la suivante : si le bean migre d'une JVM à une autre, le ThreadLocal va pas le suivre, donc ça va mal se passer.


 
tout à fait


---------------
Just because you feel good does not make you right
n°847238
d4rK 3Mpr0​R
fr33 Kevin
Posté le 10-09-2004 à 18:31:44  profilanswer
 

Je suis le |-|4><0R du JZ33

n°847272
benou
Posté le 10-09-2004 à 19:29:47  profilanswer
 

d4rK 3Mpr0R a écrit :

Je suppose que la remarque à propos du clustering de darque était la suivante : si le bean migre d'une JVM à une autre, le ThreadLocal va pas le suivre, donc ça va mal se passer.


je vois pas bien ce que ca change ... un autre ThreadLocale sera créé et puis voilà ...


---------------
ma vie, mon oeuvre - HomePlayer
n°847280
d4rK 3Mpr0​R
fr33 Kevin
Posté le 10-09-2004 à 19:56:27  profilanswer
 

c'est sûr que dans le cas présent, on s'en fout, mais dans le cas général, ça va très mal se passer si un ejb a un de ses membres qui changent à la volée.

n°847400
darklord
You're welcome
Posté le 10-09-2004 à 22:25:10  profilanswer
 

benou a écrit :

je vois pas bien ce que ca change ... un autre ThreadLocale sera créé et puis voilà ...


 
et l'information contextuelle elle passe avec? Ct une discussion plus générale que le SimpleDateFormat ;)


---------------
Just because you feel good does not make you right
n°847436
benou
Posté le 10-09-2004 à 23:16:37  profilanswer
 

darklord a écrit :

et l'information contextuelle elle passe avec? Ct une discussion plus générale que le SimpleDateFormat ;)


ca me viendrait pas trop à l'idée de mettre des infos contextuelles dans un thread, mais tu as raison ... on peut pas l'empecher ...
 
quelle genre de données contextuelle tu voudrais mettre ? t'as un exemple ?


Message édité par benou le 10-09-2004 à 23:19:31

---------------
ma vie, mon oeuvre - HomePlayer
n°847444
darklord
You're welcome
Posté le 10-09-2004 à 23:41:03  profilanswer
 

benou a écrit :

ca me viendrait pas trop à l'idée de mettre des infos contextuelles dans un thread, mais tu as raison ... on peut pas l'empecher ...
 
quelle genre de données contextuelle tu voudrais mettre ? t'as un exemple ?


 
J'ai un exemple pratique. J'ai un framework batch utilisé pour lancer des taches lourdes en asynchrone. Le batch se fait en plusieurs étapes distinctes et je souhaite passer une information contextuelle pendant son exécution. Au lieu de passer un objet "Contexte" à chacune de mes méthodes, je la stocke (et le cache -> protected) dans un ThreadLocal.  
 
Cela dit, je vais devoir changer ça puisqu'on est justement en train de clusteriser le truc :/
 
Cela dit ca a du sens car le traitement du batch est initié par une message recu sur une queue JMS (un thread, démarré lorsqu'un message d'éxécution de batch est recu)


Message édité par darklord le 10-09-2004 à 23:41:55

---------------
Just because you feel good does not make you right
n°847448
d4rK 3Mpr0​R
fr33 Kevin
Posté le 10-09-2004 à 23:45:19  profilanswer
 

darklord a écrit :

Cela dit ca a du sens car le traitement du batch est initié par une message recu sur une queue JMS (un thread, démarré lorsqu'un message d'éxécution de batch est recu)

à l'intuite, je dirais qu'on peut faire un traitement de 3 heure dans un bean JMS puisque le container a le droit de le dupliquer pour libérer le thread.
 
J'ai faux ?  
 
 
Je hacke trop ?

n°847451
julienv
Posté le 10-09-2004 à 23:49:36  profilanswer
 

les objets SimpleDate sont stateless donc cela n influe pas dans ce cas la.
 

d4rK 3Mpr0R a écrit :

Je suppose que la remarque à propos du clustering de darque était la suivante : si le bean migre d'une JVM à une autre, le ThreadLocal va pas le suivre, donc ça va mal se passer.

n°847453
julienv
Posté le 10-09-2004 à 23:55:21  profilanswer
 

d4rK 3Mpr0R a écrit :

Je suppose que la remarque à propos du clustering de darque était la suivante : si le bean migre d'une JVM à une autre, le ThreadLocal va pas le suivre, donc ça va mal se passer.


 
oui un thread local ne remplace pas une session, ce n est pas un endroit pour y ranger des objets propres a un utilisateur mais propre a un thread, security, transaction etc...
 
Si l on veut y mettre de l info propre a un user, il faut dans ce cas utiliser une methode du genre ServletFilter :
 
public void doFilter(req,resp)
{
   try {
      Object o = getSomeUserSessionObject();
      Storage.set(o);
      doFilter(req,resp);
      }
   finally {
      Storage.set(null);
      }
 
Et ensuite dans le reste de la stack j2ee on peut utiliser l objet de session. Certains font ca dans leur appli web, c est tout a fait valide mais cela montre des defaut dans le design de leur appli a moon avis.
   
}
 
------
 
Pour en revenir a ce qui confirmait Darklord, avec l exemple ci dessus, l objet va etre desassocie du Thread qd la requete se termine et ensuite la replication de la session HTTP repliquera l'etat de l'objet sur le cluster.


Message édité par julienv le 10-09-2004 à 23:57:40
n°847455
d4rK 3Mpr0​R
fr33 Kevin
Posté le 10-09-2004 à 23:58:24  profilanswer
 

julienv a écrit :

les objets SimpleDate sont stateless donc cela n influe pas dans ce cas la.

pour pinailler un peu : y'a des setBidules() dans SimpleDateFormat donc ils sont pas du tout stateless.
 
pour être plus sérieux, bientendu que dans ce cas-là, on peut migrer sans pb, mais le but était d'ouvrir le débat. C'est une technique loin d'être généralisable et complètement hors-spec.

n°847456
benou
Posté le 10-09-2004 à 23:58:49  profilanswer
 

julienv a écrit :

Certains font ca dans leur appli web, c est tout a fait valide mais cela montre des defaut dans le design de leur appli a moon avis.


là c'est même très con ... autant stocker l'objet en attribut de requete ...
 
edit : à moins que tu ais pas accès à la requête dans les objets dans lequels tu veux utiliser cet objet [:gratgrat]


Message édité par benou le 10-09-2004 à 23:59:37

---------------
ma vie, mon oeuvre - HomePlayer
n°847460
benou
Posté le 11-09-2004 à 00:01:18  profilanswer
 

comment ca s'utilise habituellement un ThreadLocal depuis plusieurs objets différents ? on stocke l'instance du ThreadLocale en tant que variable static pour pouvoir y accéder depuis tous les objets ?


---------------
ma vie, mon oeuvre - HomePlayer
n°847462
d4rK 3Mpr0​R
fr33 Kevin
Posté le 11-09-2004 à 00:02:12  profilanswer
 

benou a écrit :

comment ca s'utilise habituellement un ThreadLocal depuis plusieurs objets différents ? on stocke l'instance du ThreadLocale en tant que variable static pour pouvoir y accéder depuis tous les objets ?

oui, je suppose. mais je suppose surtout qu'habituellement ça ne s'utilise pas ...

n°847463
benou
Posté le 11-09-2004 à 00:06:50  profilanswer
 

d4rK 3Mpr0R a écrit :

oui, je suppose. mais je suppose surtout qu'habituellement ça ne s'utilise pas ...


bha pkoi pas ? le coup de la simpledateformat ce serait stupide de limiter son utlisation à un seul objet ...


---------------
ma vie, mon oeuvre - HomePlayer
n°847464
julienv
Posté le 11-09-2004 à 00:07:10  profilanswer
 

En general tu ne te sers du ThreadLocal que temporairement durant une invocation. Par exemple dans le cas d'un EJB appelant un autre EJB dans un autre VM par un mecanisme de transport comme RMI, tu as ce genre de chose pour propager le role de securite par exemple :
 
Servlet -> Stateless EJB qui donne le role "user" -> EJBDistant.blah() Appel RPC dans un autre container -> blah() -> etc....
 
Le stateless associe le role "user" avant d entrer dans la methode business du stateless. Ce role "user" est attache a l'appel par un ThreadLocal. Ensuite la method business appelle l EJB distant via son proxy et a ce moment la le role "user" attache au ThreadLocal est passe dans l'appel distant. Lorsque l EJB distant recoit l appel, il prend ce role "user" et le reassocie au thread grace au ThreadLocal.
 

darklord a écrit :

J'ai un exemple pratique. J'ai un framework batch utilisé pour lancer des taches lourdes en asynchrone. Le batch se fait en plusieurs étapes distinctes et je souhaite passer une information contextuelle pendant son exécution. Au lieu de passer un objet "Contexte" à chacune de mes méthodes, je la stocke (et le cache -> protected) dans un ThreadLocal.  
 
Cela dit, je vais devoir changer ça puisqu'on est justement en train de clusteriser le truc :/
 
Cela dit ca a du sens car le traitement du batch est initié par une message recu sur une queue JMS (un thread, démarré lorsqu'un message d'éxécution de batch est recu)


Message édité par julienv le 11-09-2004 à 00:10:44
n°847465
julienv
Posté le 11-09-2004 à 00:09:33  profilanswer
 

lol, ok.
 
Quand je dis stateless c est dans le contexte d utilisation court que dure un SimpleDateFormat i.e :
 
a = new SimpleDateFormat();
// on utilise a
a = null; // le garbage va recuperer a
 

d4rK 3Mpr0R a écrit :

pour pinailler un peu : y'a des setBidules() dans SimpleDateFormat donc ils sont pas du tout stateless.
 
pour être plus sérieux, bientendu que dans ce cas-là, on peut migrer sans pb, mais le but était d'ouvrir le débat. C'est une technique loin d'être généralisable et complètement hors-spec.

n°847466
julienv
Posté le 11-09-2004 à 00:09:57  profilanswer
 

benou a écrit :

là c'est même très con ... autant stocker l'objet en attribut de requete ...
 
edit : à moins que tu ais pas accès à la requête dans les objets dans lequels tu veux utiliser cet objet [:gratgrat]


 
tout a fait.

n°847468
benou
Posté le 11-09-2004 à 00:11:46  profilanswer
 

et ca se passe comment le user à l'EJB distant ? c'est quoi l'intérêt de la passer dans un ThreadLocale plutot que directement ?


---------------
ma vie, mon oeuvre - HomePlayer
n°847469
d4rK 3Mpr0​R
fr33 Kevin
Posté le 11-09-2004 à 00:13:58  profilanswer
 
n°847470
d4rK 3Mpr0​R
fr33 Kevin
Posté le 11-09-2004 à 00:17:17  profilanswer
 

benou > je spécule que c'est parce que un seul thread peut rentrer à la fois dans un bean et qu'on laisse la concurrence entre threads se démerder jusqu'à l'entrée dans le bloc de synchronisation (dans le proxy d'ejb) donc on doit avoir un code uniforme (ie. on s'en branle du thread, on va chercher l'user et c'est le bon, à tous les coups).

n°847471
julienv
Posté le 11-09-2004 à 00:17:26  profilanswer
 

benou a écrit :

et ca se passe comment le user à l'EJB distant ? c'est quoi l'intérêt de la passer dans un ThreadLocale plutot que directement ?


 
Dans ce cas la tu n a pas le choix car tu appelle du code utilisateur. Supposons que le code du container EJB appelle la methode du stateless bean :
 
Principal principal = getPrincipalForThisEJB();
SecurityAssociation.setPrincipal(principal);
stateless.methode(); // En general c est un appel reflectif
 
-----------
 
dans ma methode de l'EJB tu as :
 
public void methode()
{
   distant.methodeDistante();
}
 
-----------
 
En fait distant est un proxy qui va faire qqch du genre :
 
Principal principal = SecurityAssociation.getPrincipal();
Invocation invocation = new Invocation();
invocation.setPrincipal(principal);
invoker.invoke(invocation);
 
-----------
 
L'objet invocation represente une invocation et l'objet invoker represente un mechanisme de transport qui va envoyer l objet invocation ailleurs.
 
Dans ce cas la on voir que l info dans le ThreadLocal va etre utilisee pour etre ensuite attachee a l'invocation.
 
-----------
 
Au final le conteneur EJB **DOIT** utiliser l objet ThreadLocal pour parvenir a ses fins.


Message édité par julienv le 11-09-2004 à 00:19:47
n°847474
benou
Posté le 11-09-2004 à 00:22:37  profilanswer
 

ha ok, tu parlais du code du conteneur EJB ... je croyais que du codage des ejb en eux même ...


---------------
ma vie, mon oeuvre - HomePlayer
n°847476
julienv
Posté le 11-09-2004 à 00:25:01  profilanswer
 

benou a écrit :

ha ok, tu parlais du code du conteneur EJB ... je croyais que du codage des ejb en eux même ...


 
C'est un exemple pour montrer que l info dans le TheadLocal n'y reste pas tout le temps, en general que durant le temps d'une invocation.

n°847477
benou
Posté le 11-09-2004 à 00:26:02  profilanswer
 

julienv a écrit :

C'est un exemple pour montrer que l info dans le TheadLocal n'y reste pas tout le temps, en general que durant le temps d'une invocation.


ok j'ai capté


---------------
ma vie, mon oeuvre - HomePlayer
n°847478
benou
Posté le 11-09-2004 à 00:27:48  profilanswer
 

une question bête : pkoi ils ont pas plutot rendu accessible une Map au niveau du thread (genre Thread.getAttributeMap()).  
Pkoi ils se sont fait chier à faire ThreadLocal ?


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
Réseau : synchronisation dans un jeuPb dans un programme très simple
Un logiciel d'entraînement dactylographique... c'est pas simple ![PHP] Cherche forum simple compatible MS SQL Server
Manipulation simple table Access - doublons[C] Programme simple...
Optimisation requete simplequestion toute simple d'un nioub en la matiere... =)
[js]modification toute simple:affichage dans une framesynchronisation de tâches
Plus de sujets relatifs à : (Simple)DateFormat et synchronisation


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)