[Java/Servlet] Balcer une page d'attente avt le début d'un traitement

Balcer une page d'attente avt le début d'un traitement [Java/Servlet] - Java - Programmation

Marsh Posté le 17-02-2004 à 17:38:36    

Ca se fait comment, ça ? Parce le traitement est démarré ds la méthode service(...), à l'issue de laquelle la jsp s'affiche, dc je vois pas trop comment faire s'afficher la jsp avant (dites moi si je suis pas clair :D ).
 
Ca se fait, pourtant, donc comment ? Chuis sûr que c'est tout con, en plus...

Reply

Marsh Posté le 17-02-2004 à 17:38:36   

Reply

Marsh Posté le 18-02-2004 à 01:51:41    

deux trucs, soit tu fais du out.print(pouet) sans flusher ni sortir de la methode service, mais bon.
soit tu passes par une page d'attente qui raffraichiras qques temps plus tard.
j'suis fan de ni l'un ni l'autre :/


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 18-02-2004 à 15:37:17    

the real moins moins a écrit :

deux soit tu passes par une page d'attente qui raffraichiras qques temps plus tard


Ouais mais cette page d'attente est forct lancée par la méthode service, nan ? Et dc y'a pas moyen de l'afficher avant de lancer le traitement...

Reply

Marsh Posté le 18-02-2004 à 18:27:03    

c'est décorélé : tu lances le traitement et tu balances la page d'attente. La page d'attente contient un javascript ou un meta expire qui recharge la page automatiqueemnt au bout d'un certain nombre de secondes => si le traitement est en cours tu rebalance la même page, si le traitement est fini, tu balances la page que tu veux


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-02-2004 à 09:58:28    

benou a écrit :

c'est décorélé : tu lances le traitement et tu balances la page d'attente. La page d'attente contient un javascript ou un meta expire qui recharge la page automatiqueemnt au bout d'un certain nombre de secondes => si le traitement est en cours tu rebalance la même page, si le traitement est fini, tu balances la page que tu veux


Oui, c'est comme ça que j'essaye de faire, mais c'est le gras qui pose pb : vu que le traitement est lancé ds la méthode service(...), la page d'attente ne s'affiche que lorsque celui-ci est terminé, ce qui ne sert à rien. T'as un moyen de passer outre cela ?
Pr l'instant, un collègue m'a conseillé de lancer mon traitement ds un Thread à part, mais là ce qui coince, c'est qu'il n'y a plus moyen d'avoir le moindre retour du Thread (logique) :/

Reply

Marsh Posté le 19-02-2004 à 10:09:46    

je sais pas si c'est ç que tu veux...
 
dans ta methode service :
 

Code :
  1. new Thread() {
  2. public void run() {
  3. maMethodeQuiFaitMonTraitement();
  4. }.start();


 
mais j'avoue que c pas ce qui se fait de mieux :/


Message édité par LAs3R le 19-02-2004 à 10:12:47
Reply

Marsh Posté le 19-02-2004 à 10:36:10    

scOulOu a écrit :


Oui, c'est comme ça que j'essaye de faire, mais c'est le gras qui pose pb : vu que le traitement est lancé ds la méthode service(...), la page d'attente ne s'affiche que lorsque celui-ci est terminé, ce qui ne sert à rien. T'as un moyen de passer outre cela ?
Pr l'instant, un collègue m'a conseillé de lancer mon traitement ds un Thread à part, mais là ce qui coince, c'est qu'il n'y a plus moyen d'avoir le moindre retour du Thread (logique) :/


ben il faut que tu sois capable de savoir quand ton traitement est fini.
 
ex :  

Code :
  1. public class TonTraitement implements Runnable {
  2.     private boolean finished = false;
  3.     public void run() {
  4.         // ... ton traitement ...
  5.         this.finished = true;
  6.     }
  7.     public boolean isFinished() { return this.finished; }
  8. }
  9. // ...
  10. // dans ta méthode service  
  11.    HttpSession session = request.getSession();
  12.    synchronized (session) {
  13.       TonTraitement trait = (TonTraitement) session.getAttribute(WebConstants.Session.TRAITEMENT);
  14.       if (trait == null) {
  15.          trait  = new TonTraitement();
  16.          Thread thread = new Thread(trait, "Web work for user Machin" );
  17.          thread.setDaemon(true); // par sécurité ...
  18.          session.setAttribute(WebConstants.Session.TRAITEMENT, trait);
  19.          thread.start();
  20.          // pour faire les choses bien il faudrait faire un Listener de session qui interompt le thread à la fermeture de la session si il n'est pas encore arrêté ...
  21.       } else if (trait.isFinished()) {
  22.          request.getDispatcher("workDone.jsp" ).forward(request, response);
  23.          session.removeAttribute(WebConstants.Session.TRAITEMENT);
  24.          return;
  25.       } else  {
  26.          request.getDispatcher("workInProgress.jsp" ).forward(request, response);
  27.          return;
  28.       }
  29.    }


Message édité par benou le 19-02-2004 à 10:42:14

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-02-2004 à 10:52:48    

benou et LAs3R > ouais c'est un peu comme ça que je voulais éviter de faire ( :D ), mais c'est pas grave, y'a qd même moyen de s'en sortir de cette façon... (et j'avais pas pensé au coup de la session, qui pourrait m'éviter d'avoir à créer une table)
 
Merci tlm :jap:

Reply

Marsh Posté le 19-02-2004 à 10:56:28    

scOulOu a écrit :

c'est un peu comme ça que je voulais éviter de faire


ben t'as pas trop le choix ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-02-2004 à 10:56:39    

benou a écrit :


ben il faut que tu sois capable de savoir quand ton traitement est fini.
 
ex :  

Code :
  1. public class TonTraitement implements Runnable {
  2.     private boolean finished = false;
  3.     public void run() {
  4.         // ... ton traitement ...
  5.         this.finished = true;
  6.     }
  7.     public boolean isFinished() { return this.finished; }
  8. }
  9. // ...
  10. // dans ta méthode service  
  11.    HttpSession session = request.getSession();
  12.    synchronized (session) {
  13.       TonTraitement trait = (TonTraitement) session.getAttribute(WebConstants.Session.TRAITEMENT);
  14.       if (trait == null) {
  15.          trait  = new TonTraitement();
  16.          Thread thread = new Thread(trait, "Web work for user Machin" );
  17.          thread.setDaemon(true); // par sécurité ...
  18.          session.setAttribute(WebConstants.Session.TRAITEMENT, trait);
  19.          thread.start();
  20.          // pour faire les choses bien il faudrait faire un Listener de session qui interompt le thread à la fermeture de la session si il n'est pas encore arrêté ...
  21.       } else if (trait.isFinished()) {
  22.          request.getDispatcher("workDone.jsp" ).forward(request, response);
  23.          session.removeAttribute(WebConstants.Session.TRAITEMENT);
  24.          return;
  25.       } else  {
  26.          request.getDispatcher("workInProgress.jsp" ).forward(request, response);
  27.          return;
  28.       }
  29.    }




 
[:darkmavis]

Reply

Marsh Posté le 19-02-2004 à 10:56:39   

Reply

Marsh Posté le 19-02-2004 à 10:57:32    

scOulOu a écrit :

Pr l'instant, un collègue m'a conseillé de lancer mon traitement ds un Thread à part, mais là ce qui coince, c'est qu'il n'y a plus moyen d'avoir le moindre retour du Thread (logique) :/


qu'est ce que tu veux comme retour ?
 
tout ce que tu veux garder tu peux le sauver dans la classe TonTraitement dans mon exemple ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-02-2004 à 11:16:16    

benou a écrit :

qu'est ce que tu veux comme retour ?
 
tout ce que tu veux garder tu peux le sauver dans la classe TonTraitement dans mon exemple ...


En fait je pensais que ds l'appli les rollback() (lors d'une exception pendant le traitement) étaient fait au niveau de la servlet, ce qui aurait été un peu compliqué à mettre en oeuvre (pas possible de catcher une exception lancée ds le Thread), mais il s'avère que c'est plus bas, dc ça rle.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed