2009-08-31 8 views
2

Lorsque je clique sur un lien, une fenêtre contextuelle s'ouvre.J'ai un bean géré par session qui charge java.util.List.Il prend quelques secondes pour charger cette liste.Problème de simultanéité JSF

lorsque je clique deux fois sur le lien, je reçois une exception de modification simultanée. parce que la page est en mode session et que la première demande est toujours en train de charger la liste, avant qu'elle ne se termine, la deuxième demande tente de mettre à jour la liste.

J'ai deux solutions possibles à la main

1) l'introduction de bloc synchronisé

Question: Présentation de bloc synchronisé conduit à des problèmes de performances dans un environnement multithread?

2) javascript pour désactiver le lien une fois qu'il a cliqué. Problème: Ce n'est pas une bonne option car nous devons restaurer l'état de javascript une fois le popup chargé. Il est possible que le lien soit désactivé pour toujours si la fenêtre contextuelle s'est terminée de manière anormale.

Existe-t-il une autre solution à ce problème?

Répondre

2

Je choisirais l'option 1. synchroniser sur quelque chose dans la session ou sur le bean de session c'est soi-même. Dans un environnement de serveur unique, cela devrait être assez sûr, mais dans un cluster qui n'utilise pas de sessions persistantes, vous devrez chercher un meilleur singleton.

Les performances ne doivent pas être effectuées car vous synchroniserez pour chaque session d'utilisateur pour ce bean session particulier et s'il n'y a pas de conflit, le coût ne mérite pas d'être pris en compte.

1

Une solution alternative est de faire en sorte que la fenêtre modale de la fenêtre POPUP signifie que la fenêtre parent sera être floue/éclipsée jusqu'à ce que Pop-up soit fermé. recherche de code JavaScript.

+0

Richfaces fournit déjà une fenêtre contextuelle modale (modalPanel). D'autres bibliothèques peuvent également fournir un tel composant. – romaintaz

+0

Je ne suis pas autorisé à utiliser la fenêtre modale.! ; ( – Madhu

0

Choisissez la 2ème option.

+0

Décrire le choix aurait été une meilleure option! Ce n'est pas évident pourquoi vous suggérez la 2ème option. – Iravanchi

0

si vous utilisez des visages riches, vous pouvez utiliser la bibliothèque de a4j des visages riches et rerender le lien popup

<a4j:commandButton id="popupLinkId" onlick="window.open("popupLink");return false;" reRender="popupLinkId" /> 

Ici a4j est la ajax pour la bibliothèque jsf visages riches. Reportez-vous au lien http://livedemo.exadel.com/richfaces-demo/richfaces/support.jsf;jsessionid=B9DFBAF3AFD62C96B94EEC67FC4645A5?c=support&tab=usage pour plus de détails.