IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

connexion à une application web + processus parallèle sur le serveur


Sujet :

Développement Web en Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Points : 239
    Points
    239
    Par défaut connexion à une application web + processus parallèle sur le serveur
    Bonjour à tous!



    Je viens de me poser une question, si ca se trouve c'est débile mais c'est une question de fonctionnement basique des appli web. Ca fait quelque temps que je développe des appli web, mais j'avoue que je ne métais jamais posé la question :

    Une fois l'appli déployée sur le serveur d'appli, les client peuvent y accéder. Ca c'est ok ( tout de même lol)
    Mettons qu'un premier client lance l'appli. vu que personne est connecté, c'est lui qui fait que tout est initialisé, en particulier les objets java. Si un deuxième client se connecte, alors est ce que les objets java de l'appli sont de nouveau créé? Je veux dire est ce que du coup c'est comme si sur le pc serveur on avait deux fois la même appli qui tourne? ou alors est -ce que c'est plus comme si on avait une seule appli qui tourne mais que on la voit sur 2 écrans différents?

    En fait cette question je me la pose pour des questions de performances de mon appli ... En effet il faut que j'ai un thread qui aille toutes les X secondes checker la BDD, pour voir si il n'y aurait pas de nouvelles données.
    Mon souci c'est que si a chaque nouvelle connexion a mon appli ca redémarre le thread je vais avoir trop de requête en Base de données et du coup ca va trop ramer et mon appli sera pas performante...

    Voilà, si quelqu'un pouvait éclairer mes lanternes svp...

    Anne
    N'oubliez pas que l'eau ça rouille !
    est votre ami !

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Points : 239
    Points
    239
    Par défaut
    on m'a conseillé de regarder du côté des démons....
    Mais si je fais ca le truc va tourner sur mon serveur en permanance....

    Vous en pensez quoi?
    N'oubliez pas que l'eau ça rouille !
    est votre ami !

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Points : 239
    Points
    239
    Par défaut
    Finalement j'ai fait un singleton dans mon pgm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class MySingleton {
        private static  MySingleton _instance;
        private MyThread myThread;
        private MySingleton() {
            // construct object . . .
        	MyThread p = new MyThread();
        	myThread=p;
            p.start();
        }
        // For lazy initialization
        public static synchronized MySingleton getInstance() {
            if (_instance==null) {
                _instance = new MySingleton();
            }
            return _instance;
        }
            // Remainder of  class definition . . .
    	/**
             * @return the myThread
             */
    	public MyThread getMyThread() {
    		return myThread;
    	}
    }
    sachant que MyTread c'est ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class MyThread extends Thread {
            private boolean running;
            private int i;
     
            MyThread() {
            	running=true;
            	i=0;
            }
     
            public void run() {
            	System.out.println("démarrage du thread");
            	long millis = (long) (60*1000);
            	while(running){
            		System.out.println("run number = "+i);
            		try{
                		sleep(millis);
                		i++;
                	}
                	catch (InterruptedException e){
                		System.out.println("exception sleep");
                	}
            	}
            }
    }
    et dans la classe action ou j'ai besoin de récupérer les valeurs que le thread va consulter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MySingleton.getInstance();
    maintenant quant à savoir si c'est dub code propre....et surtout si c'est génant parce que pas top pour un azppli web.... j'en sais rien vu que j'avais encore jamais été amenée à utiliser les thread comme ca en j2ee

    voilà!!!
    N'oubliez pas que l'eau ça rouille !
    est votre ami !

  4. #4
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    Citation Envoyé par AnneB
    maintenant quant à savoir si c'est dub code propre....et surtout si c'est génant parce que pas top pour un azppli web....
    Si ce thread est initialisé par l'appli web, à chaque redéploiement un nouveau thread sera recréé (le classloader est déréférencé, donc ton singleton aussi). Pour être averti du redéploiement et arrêter le thread (en mettant running=false), utilise un ServletContextListener.

    De plus ton serveur ne s'arrêtera pas car le thread n'est pas démon (utilise la méthode setDaemon(true) du thread)
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Points : 239
    Points
    239
    Par défaut
    Citation Envoyé par Grégory Picavet
    De plus ton serveur ne s'arrêtera pas car le thread n'est pas démon (utilise la méthode setDaemon(true) du thread)
    Je ne comprend pas.... si jamais j'arrête le serveur alors forcément tous les processus en cours seront tués non?
    N'oubliez pas que l'eau ça rouille !
    est votre ami !

  6. #6
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    si tu stoppe le serveur sauvagement (kill -9 ou ctrl-c), tous les threads (on ne parle pas de processus ici) seront tués, mais tu risques de laisser des lock sur tes ressources ouvertes, ce qui est mal.
    mais si tu essayes d'arrêter le serveur par script, le serveur ne pourra pas stoppé les threads créés par l'application, uniquement ceux managés par son pool de threads. cf. http://tomcat.apache.org/faq/misc.html#stop

    c'est valable pour toutes les applications java. Par exemple dans une application Swing, tu est obligé de faire System.exit(-1) lors de la fermeture de la fenêtre sinon le programme tourne toujours...
    "Les gens normaux croient que si ca marche, c'est qu'il n'y a rien à reparer. Les ingénieurs croient que si ca marche, c'est que ca ne fait pas encore assez de choses."
    --Scott Adams

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 372
    Points : 239
    Points
    239
    Par défaut
    ok
    J'ai fait ca

    Donc c'est cool ca marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public class MyThread extends Thread implements ServletContextListener{
            private boolean running;
            private int i;
     
            private ArrayList alarms;
     
            MyThread() {
            	// wait to run server
            	running=false;
            	// thread daemon in order to enable server to shut down properly
            	setDaemon(true);
            	// init var for suystem.out.println
            	i=0;
            }
     
            public void run() {
            	System.out.println("démarrage du thread");
            	// sleep time for the thread = 3 seconds
            	long millis = (long) (3*1000);
            	running = true;
            	while(running){
            		System.out.println("run number = "+i);
            		try{
            			// sleep
                		sleep(millis);
                		i=i+3;
                		//then access to the database
                		// get all the alarms
                		ApiIdexAnne apiIdex = ApiIdexAnne.getInstance();
                		apiIdex.updateAlarms(i);
                	}
                	catch (InterruptedException e){
                		System.out.println("exception sleep");
                	}
            	}
            }
     
    		/**
                     * @return the running
                     */
    		public boolean isRunning() {
    			return running;
    		}
     
    		/**
                     * @param running the running to set
                     */
    		public void setRunning(boolean running) {
    			this.running = running;
    		}
     
    		public void contextDestroyed(ServletContextEvent arg0) {
    			running=false;
    			System.out.println("halt thread");
    		}
     
    		public void contextInitialized(ServletContextEvent arg0) {
    		}
    }
    enfin maintenant je suoppose que ca marche parce que de tte facon je ne vois pas si c'est tout ok

    Merci bcp pour tes conseils Grégory Picavet
    N'oubliez pas que l'eau ça rouille !
    est votre ami !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/03/2011, 08h59
  2. Réponses: 2
    Dernier message: 10/03/2011, 10h13
  3. Automatiser connexion à une application web
    Par zeus2005 dans le forum Windows
    Réponses: 5
    Dernier message: 09/04/2010, 13h51
  4. Réponses: 0
    Dernier message: 29/10/2009, 11h53
  5. Réponses: 3
    Dernier message: 31/10/2007, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo