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

Collection et Stream Java Discussion :

Quartz et getCurrentlyExecutingJobs


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 16
    Par défaut Quartz et getCurrentlyExecutingJobs
    Bonjour,

    Nous avons utilisé au sein d'une application J2EE, l'api QUARTZ qui permet de lancer des traitements plus ou moins long.

    Je voudrais mettre en place une lecture de la liste des Jobs lancés par QUARTZ, afin d'évaluer le nombre de jobs et de gérer ces jobs (Arrêter, résumer ...)

    A la lecture des docs, des APIs que j'ai pu trouver sur la toile, il y a un élément nommé JobStore qui permet de faire cela avec une extension qui est RAMJobStore pour les avoirs en mémoire directement (à ce que j'ai compris).

    Cependant malgré toute la bonne volonté du monde, je n'arrive pas à trouver un exemple concret du fonctionnement de JobStore et comment je peux récupérer la liste de mes jobs en cours d'exécution ... un sample simple ... Ou il y a peut-être d'autre solution ?

    Merci d'avance de votre réponse.

    Michael.

  2. #2
    Membre expérimenté
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Par défaut
    Je pense que tu as besoin d'utiliser Scheduler plutôt (cf: http://www.opensymphony.com/quartz/a...Scheduler.html)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 16
    Par défaut
    Alors tout à fait, j'avais commencé par essayer cette solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Récupération de la factory pour du scheduler
    StdSchedulerFactory factory = (StdSchedulerFactory) this.servlet.getServletContext().getAttribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY);
     
    Scheduler sch = factory.getScheduler();
     
    // List getCurrentlyExecutingJobs() 
    //Return a list of JobExecutionContext objects that represent all currently executing Jobs in this Scheduler instance. 
    List info = sch.getCurrentlyExecutingJobs();
    Mais la variable info est vide ... et je ne vois pas pourquoi, et mon job est bien en cours ...

  4. #4
    Membre expérimenté
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Par défaut
    Ça n'est pas normal je pense, on peux voir comment tu crée tes jobs et comment tu lance quartz?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 16
    Par défaut
    Je lance, via mon web.xml 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
     
     <context-param>
     	<param-name>shutdown-on-unload</param-name>
     	<param-value>true</param-value>
     </context-param>
     
     <context-param>
     	<param-name>start-scheduler-on-load</param-name>
     	<param-value>true</param-value>
     </context-param>
     
     <listener>
      <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
     </listener>
    Le fichier quartz.properties :
    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
     
    #=========================================================
    # Configure Main Scheduler Properties   
    #=========================================================
     
    org.quartz.scheduler.instanceName = sinWebScheduler 
    org.quartz.scheduler.instanceId   = 1
    org.quartz.scheduler.rmi.export   = false
    org.quartz.scheduler.rmi.proxy    = false
     
    #=========================================================
    # Configure ThreadPool   
    #=========================================================
     
    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
    org.quartz.threadPool.threadCount =  5
    org.quartz.threadPool.threadPriority = 5 
     
    #=========================================================
    # Configure JobStore   
    #=========================================================
     
    org.quartz.jobStore.misfireThreshold = 60000  
    org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
    puis je lance un job, comme suit dans une Action Strust :

    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
     
    // Récupération de la factory pour du scheduler
    StdSchedulerFactory factory = (StdSchedulerFactory) this.servlet.getServletContext().getAttribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY);
     
    Scheduler sch = factory.getScheduler();
    request.setAttribute("scheduler", sch);
     
    // Création d'un nom de job pour les forfaits.
    String nameJob = "job"+user.getUid().toLowerCase()+"impFft";
     
    //Création du job
    JobDetail jobDetail = new JobDetail(nameJob, Scheduler.DEFAULT_GROUP, ImportForfaitJob.class);
    jobDetail.setJobDataMap(map);
    jobDetail.setDurability(true); // Permet de rester dans la file afin qu'il soit supprimer manuellement
    jobDetail.setVolatility(true); // N'est pas conserver après reboot du serveur web.
    sch.addJob(jobDetail, true);  // Ajout du job dans le scheduler
     
    // Exécution du job
    SimpleTrigger trigger = null;
    try {
                trigger = new SimpleTrigger("trt"+user.getUid().toLowerCase()+"impFft", Scheduler.DEFAULT_GROUP);
    	trigger.setJobName(jobDetail.getName());
    	sch.scheduleJob(trigger);
    } catch (org.quartz.ObjectAlreadyExistsException e) {
    	log.debug("InitialiserCycleAction le job est déjà là: ", e);
    }
    Est ce que j'ai oublié qqchose ?

  6. #6
    Membre expérimenté
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Par défaut
    Non, personnellement je ne vois pas, et si tu fais getCurrentlyExecutingJobs() avec la même instance de Scheduler, juste après avoir ajouté ton job ça ne fonctionne pas?

    Le seul soucis qui peux arriver c'est que la StdSchedulerFactory te génère un nouveau Scheduler et qu'il n'ait pas accès aux précédents jobs...

    Perso j'utilise la même instance en faisant un lookup JNDI en cas de besoin.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 16
    Par défaut
    Je te confirme que le getCurrentlyExecutingJobs() fonctionne correctement avec le scheduler lorsque c'est le même scheduler.

    Ceci ne m'arrange pas ... Hélas

    J'utilise une factory, OK, cependant je peux quand même retrouver la liste des listeners qui sont en cours ? Lorsque j'utilise getAllSchedulers() sur la factory, il me rend bien cette fois mon sinWebScheduler, mais comment récupérer les informations du scheduler "sinWebScheduler" ?

    Pour ta proposition - Est ce que tu peux m'expliquer ce que tu veux dire là ?
    un lookup JNDI en cas de besoin

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu devrais stocker le scheduler, plutot que la factory dans le context.

    Ensuite, une fois que tu as un scheduler, il faut faire getJobGroupNames() pour avoir la liste des groupes. Pour chaque groupe, il faut faire getJobNames() pour avoir la liste des jobid, et ensuite, il faut faire avec group + jobid, getJobDetail().


    Le CurrentlyExecutingJob te retourne exactement ce qui est marqué dans la doc: la liste des jobs en cours d'exécution. Les jobs en attente et les jobs fini n'y apparaissent pas.

  9. #9
    Membre expérimenté
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Par défaut
    Citation Envoyé par Hecco Voir le message
    Je te confirme que le getCurrentlyExecutingJobs() fonctionne correctement avec le scheduler lorsque c'est le même scheduler.

    Ceci ne m'arrange pas ... Hélas

    J'utilise une factory, OK, cependant je peux quand même retrouver la liste des listeners qui sont en cours ? Lorsque j'utilise getAllSchedulers() sur la factory, il me rend bien cette fois mon sinWebScheduler, mais comment récupérer les informations du scheduler "sinWebScheduler" ?

    Pour ta proposition - Est ce que tu peux m'expliquer ce que tu veux dire là ?
    J'utilise le JBoss MBean, il s'occupe de mettre le Scheduler dans le JNDI. Tu peux l'utiliser si ton server possède un mechanisme de bean qui se chargent au démarrage ou l'implémenter toi-même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
             InitialContext rootCtx = null;
             try {
                 rootCtx = new InitialContext();
                 Name fullName = rootCtx.getNameParser("").parse(jndiName);
                 Scheduler scheduler = schedulerFactory.getScheduler();
                 NonSerializableFactory.rebind(fullName, scheduler, true);
             } finally {
                 if (rootCtx != null) {
                     try {
                         rootCtx.close();
                     } catch (NamingException JavaDoc ignore) {}
                 }
             }
    Ton scheduler est ensuite accessible via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
    env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
    InitialContext ctx = new InitialContext(env);
    Scheduler sched = (Scheduler) ctx.lookup(jndiName);

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 16
    Par défaut
    Bonjour,

    Merci à vous deux pour vos réponses, je notes ta méthode yciabaud, qui me parait interessante à garder en mémoire.

    J'ai donc réussi à lire mes jobs en exécution avec le getCurrentlyExecutingJobs, cependant, à la place de mettre : factory.getScheduler(), j'ai précisé mon scheduler comme ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Récupération de la factory pour du scheduler
    StdSchedulerFactory factory = (StdSchedulerFactory) this.servlet.getServletContext().getAttribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY);
     
    //Collection info = factory.getScheduler();
    Scheduler sch = factory.getScheduler("sinWebScheduler");
     
    List info = sch.getCurrentlyExecutingJobs();
    Dans mon application, certain de mes traitements utilisent du RMI pour envoyer des traitements à un autre listener QUARTZ. Ainsi, en revenant sur un cas de base, je me suis donc apercu que je n'interrogeais pas le bon listener quartz, car oui j'ai les 2 cas ... Cas avec RMI, ou cas de lancement de traitements sur le serveur.

    En tout cas merci de votre aide et de vos réponses, ceci m'a permis de me débloquer.

    Michael.

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

Discussions similaires

  1. probleme Quartz avec jdk 1.4
    Par decksroy dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 24/10/2006, 08h31
  2. [Servlet]Erreur tomcat avec ServletContextListener et Quartz
    Par K-Kaï dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 01/06/2006, 11h44
  3. Quartz: impossible d'instancier le scheduler!
    Par lOurs4816 dans le forum API standards et tierces
    Réponses: 28
    Dernier message: 20/04/2006, 17h11
  4. Tomcat et quartz
    Par francknamor dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 23/12/2005, 16h49
  5. [Quartz][Tomcat] Jobs.xml file not found exception
    Par Arnaud Giuliani dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 05/08/2005, 09h20

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