2012-04-23 5 views
1

J'ai besoin de mon application pour soumettre des données à un service Web et attendre 90 secondes pour la réponse. Mais s'il n'y a pas de réponse en 60 secondes, je dois rediriger l'utilisateur vers une page différente et continuer à attendre la réponse pendant 30 secondes supplémentaires s'il vient ensuite le traiter. Je sais que je dois utiliser un thread pour cela, mais je ne sais pas comment intégrer les bandes de roulement dans ce cas afin que les threads puissent échanger des données entre eux.Passer des données entre threads en Java?

Des idées? J'utilise JSF pour l'interface utilisateur.

L'exigence est la suivante: Le service Web enverra une réponse en 90 secondes (c'est le temps de réponse maximum pour cela). Mais l'utilisateur recevra une réponse (une réponse fictive au cas où la réponse ne viendrait pas dans les 60 secondes) en 60 secondes. Donc, même si l'utilisateur a reçu une réponse fictive (après 60 secondes), mon application continuera à attendre 30 secondes de plus pour la réponse

+0

https://www.youtube. com/watch? v = 378DHU9IsS4 – clstaudt

+1

"besoin de rediriger l'utilisateur vers une page différente et continuer à attendre la réponse" - ce que cela signifie? Soit vous Java-application peut être redirigé (si l'application Java est un client), Ou il y a une certaine communication sur le navigateur? Veuillez clarifier – Dewfy

+0

Vous devez probablement éviter d'utiliser des threads dans une application gérée par conteneur, car la gestion des threads est généralement effectuée par le conteneur. Je ne comprends pas vraiment le cas d'utilisation ici: attendre 60 secondes, puis rediriger (pourquoi? Pour les commentaires des utilisateurs?), Attendre 30 secondes de plus (et puis quoi?). Pouvez-vous élaborer un peu? – maksimov

Répondre

1

Je ne sais pas grand chose sur JSF, mais on dirait que vous voulez une minuterie, probablement java.util.Timer. Si la réponse revient avant que la minuterie s'éteigne, arrêtez la minuterie. Si la minuterie s'éteint, réinitialisez-la pendant 30 secondes et redirigez l'utilisateur. La prochaine fois qu'il s'éteint, abandonnez en attendant la bonne réponse.

Tant que vous semblez comprendre. Mais vous avez au moins deux fils de discussion en interaction ici. Comment communiquer? Utilisez simplement les champs d'instance.

Toutes les références à eux devraient être faites avec le code dans synchronized méthodes ou blocs. Faites cela et vous devriez aller bien. Vous devrez le comprendre, mais j'imagine que vous auriez un timerPhase int, qui indiquerait que la minuterie n'a pas été démarrée, dans les 60 premières secondes, dans les 30 prochaines, ou a expiré. Aussi un booléen answerReceived, quelque chose avec la réponse dedans, et peut-être quelques autres.

(synchronisation trop peut ralentir votre programme vers le bas. Je ne pense pas que vous aurez ce problème. Mais si vous le faites, diviser les blocs de synchroniser jusqu'à, chaque champ synchronisé séparément à moins qu'ils interagissent. Retirer la synchronisation et utilisez le mot-clé volatile Lisez sur le multithreading (lisez le mot-clé volatile.) Réfléchissez sérieusement à la façon dont les threads parallèles peuvent interagir et préparez-vous à ce que les choses deviennent vraiment bizarres.)

Questions connexes