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

Java EE Discussion :

Comment synchroniser deux thread (Timer et FacesContext)


Sujet :

Java EE

  1. #1
    Membre confirmé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Points : 559
    Points
    559
    Par défaut Comment synchroniser deux thread (Timer et FacesContext)
    Bonjour,

    Ma seule contrainte c'est d'utiliser un Tomcat. Mais je peux utiliser du spring 3 et JPA Hibernate puis coter web JSF

    Je cherche un équivalant a EJB Timer.

    Mon but c'est de faire un : session.invalidate(); mais par un timer (après 10m sans action utilisateur).

    Mon problème est : sachant que le timer utilise un Thread propre à lui et quand je veux invalider la session dans un managedBean il trouve la session=null dans son processus. (J’ai sauvegarder la session dans une var Statique mais sa invalide toutes les sessions et puis c'est contre performent de sauvegardés toutes les sessions alors quel est déjà géré pas le conteneur web)

    Merci de me proposer des solutions ?

  2. #2
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Bonjour,

    regarde du côté de Quartz :
    http://quartz-scheduler.org/

    Exemple d'usage de Quartz :
    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
     
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.impl.StdSchedulerFactory;
    import static org.quartz.JobBuilder.*;
    import static org.quartz.TriggerBuilder.*;
    import static org.quartz.SimpleScheduleBuilder.*;
     
     
    public class QuartzTest {
     
        public static void main(String[] args) {
     
            try {
                // Grab the Scheduler instance from the Factory 
                Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
     
                // and start it off
                scheduler.start();
     
                scheduler.shutdown();
     
            } catch (SchedulerException se) {
                se.printStackTrace();
            }
        }
    }


    associé avec un Filter ou mieux, un SessionListener, je pense que ça devrait faire l'affaire :

    http://www.mkyong.com/servlet/a-simp...sions-counter/
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  3. #3
    Membre confirmé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Points : 559
    Points
    559
    Par défaut
    Bonjour,
    j'ai tenté d'aller un peux plus loin sur Quartz sur leur Getting-started "ici" mais avec des petite erreur qui on,
    plus particulérment ou il faut ajouter leur bout de code entre start() et shutdown().

    voilà:
    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
     
    import org.quartz.Job;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.Trigger;
    import org.quartz.impl.StdSchedulerFactory;
     
     
    public class QuartzTest {
     
        public static void main(String[] args) throws InterruptedException {
     
            try {
                // Grab the Scheduler instance from the Factory 
                Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
                System.out.println("-1-----------------------------------------");
                // and start it off
                scheduler.start();
                System.out.println("-2-----------------------------------------");
                // define the job and tie it to our HelloJob class
                Job job = new JobDetail(HelloJob.class)
                        .withIdentity("job1", "group1")
                        .build();
     
                // Trigger the job to run now, and then repeat every 40 seconds
                Trigger trigger = new Trigger()
                        .withIdentity("trigger1", "group1")
                        .startNow()
                        .withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever())
                        .build();
     
                Thread.sleep(60000);
                // Tell quartz to schedule the job using our trigger
                sched.scheduleJob(job, trigger);
     
                scheduler.shutdown();
                System.out.println("-3-----------------------------------------");
            } catch (SchedulerException se) {
                se.printStackTrace();
            }
        }
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class HelloJob implements Job
    {
        @Override
    	public void execute(JobExecutionContext context) throws JobExecutionException {
    		System.out.println("my Hello Quartz!");	
    	}
    }
    Mais je suis pas tout à fait convaincu que ça va me permettre de commencée entre le thread de mon Timer et la session de mon MangerdBeans JSF de @SessionScoped ?

  4. #4
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    En fait je suis en train de réaliser que tu essayes de faire qqch qui existe déjà.

    il suffit de mettre ceci dans ton web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <session-config>
       <session-timeout>10</session-timeout>
    </session-config>
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  5. #5
    Membre confirmé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Points : 559
    Points
    559
    Par défaut
    Oui je sais, mais j'ai besoin des deux timer

    1. Le 1er c’est de le déclenche des que l'on ajoute des choses dans notre panier. (Un timer manuel est déclencher et 10 minute après ça session a lui est morte).
    2. Puis celui du web.xml a 20 minute (si inactivité)

    C’est pour ça que je cherche a partagé la variable session avec mon timer manuel que j'ai fait (celui de 10 minute)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FacesContext context = FacesContext.getCurrentInstance();
    session = (HttpSession) context.getExternalContext().getSession(false);
    pour pouvoir faire un session.invalidate(); dans mon @ManagedBean



  6. #6
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Tu as un managedBean en session qui représente ton Panier ?
    C'est ce managedBean qui doit instancier ton Timer et lui passer la session que tu peux obtenir comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FacesContext.getCurrentInstance().getExternalContext().getSession()
    Mais bon ça risque de mettre "le foutoir" dans la logique JSF.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  7. #7
    Membre confirmé
    Avatar de geforce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    1 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 055
    Points : 559
    Points
    559
    Par défaut
    Citation Envoyé par fxrobin Voir le message
    Tu as un managedBean en session qui représente ton Panier ?
    Oui j'ai bien managedBean en session qui représente mon panier.

    Citation Envoyé par fxrobin Voir le message
    C'est ce managedBean qui doit instancier ton Timer et lui passer la session que
    Mais bon ça risque de mettre "le foutoir" dans la logique JSF.
    voici la description de ma solution de timer:

    - j'ai fait Timer Spring : qui inject une méthode de mon managedBean panier un timer qui lui (dans cette méthode) dois ce chargé de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FacesContext context = FacesContext.getCurrentInstance();
    session = (HttpSession) context.getExternalContext().getSession(false);
    session.invalidate();
    Mais pour le timer le context est a Null.

    Voilà pour quoi je veux partagé la session entre deux thread (FacesContext, Timer)

  8. #8
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Pour ton Timer oui c'est sûr que ton context est null.


    Dans ton ManagedBean en scope session du Panier,

    Voilà à quoi ça ressemblerait sur tu transformes un peu ton programme "QuartzTest" en "InvalidateSessionTimer" et surtout la méthode "main" en "execute".

    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
     
    @ManagedBean
    @SessionScoped
    public class Panier
    {
     
        private InvalidateSessionTimer timer = null;
     
        @PostConstruct
        public void init() {
     
            FacesContext context = FacesContext.getCurrentInstance();
            HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
                timer = new InvalidateSessionTimer(session, 10);
            timer.execute();
     
        }
    }
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/10/2013, 23h39
  2. Réponses: 1
    Dernier message: 23/03/2013, 22h21
  3. UI Datepicker. Comment synchroniser deux calendriers ?
    Par php_de_travers dans le forum jQuery
    Réponses: 2
    Dernier message: 17/02/2010, 09h08
  4. Comment synchoniser deux threads ?
    Par Jayceblaster dans le forum C
    Réponses: 14
    Dernier message: 29/03/2007, 16h16
  5. Comment synchroniser deux bases de données
    Par apoingsfermes dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 15/11/2006, 22h41

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