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

Concurrence et multi-thread Java Discussion :

[Quartz] Passer paramètres à partir d'un job


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut [Quartz] Passer paramètres à partir d'un job
    Bonjour, J'utilise Quartz pour planifier des tâches. La doc explique comment passer des paramètres vers les jobs, mais je recherche le moyen de faire passer des infos en sens inverse.
    Quel serait le moyen le plus simple de passer des paramètres d'un job vers l'objet qui a planifié les jobs SVP ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Pas vraiment possible puisque l'objet qui a planifié le job n'existe plus depuis longtemps quand le job s'exécute

    Si tu veux persiter ou interagir avec des données dans ton job, il faut le faire là où sont les données, en général dans une base de donnée.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut Quartz Listeners ?
    Merci pour ces infos.

    En fait, je peux m'arranger pour que l'objet qui planifie vive le temps qu'il faut, disons pendant quelques jours. J'utilise une instruction du type

    ... Thread.sleep(TEMPS_DE_VEILLE);...
    Il serait bien qu'il puisse consulter de temps à autre une info du type "C'est fait" ou bien "Il faut tout recommencer".

    Puis-je utiliser un objet qui recueillerait les quelques infos dont j'aurais besoin ? je pense à l'interface JobListener :

    public class MyJobListener implements JobListener...
    Cet objet mis en forme serait-il lisible par l'objet qui planifie ? (Ou mieux pourrait-il envoyer l'info directement à l'objet qui planifie ?)

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Quartz ne gère pas la transmission de données. Toute ce qui va vers le job est stockée dans la DB comme propriété du job. Du fait de ce stockage, impossible de transmettre des objet complexes. Si tu veux que ton Job informe quoi que ce soit, c'est en dehors de l'api Quartz. Tu peux utiliser un JobListener, mais tu va être notifié de tous les jobs, pas seulement celui là.

    Tu job peux stocker l'info sur son état d'avancement dans une base de données, ce serait plus sur. Un objet qui attends sur un Thread.sleep -> ca ne survis pas à un arrêt de l'application. Or quand on utilise quartz, c'est justement pour avoir la garantie que les job s'exécutent.

  5. #5
    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
    peut-être une question bête étant donné que je ne l'ai jamais fait avec Quartz, mais si ta classe "appelante" implémente "JobListener", alors il te suffit de l'ajouter à ton Job qui l'appelera à la fin de son travail.

    C'est ni plus ni moins que le design pattern "Observer / Observable". C'est aussi comme cela que fonctionnent les SwingWorker en Swing ou encore les Callable / Future avec les Executor : http://java.developpez.com/cours/

    Ce n'est qu'une simple idée (à creuser) étant donnée que je ne l'ai jamais fait avec Quartz, comme indiqué au début de ma réponse.

    Peut-être un exemple ici :
    http://www.mkyong.com/java/quartz-joblistener-example/
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    fxrobin: à quartz on ne passe pas des instances mais des noms de classes, c'est là toute la difficulté. En effet, un nom de classe ça peux se stoker dans une DB, une instance c'est plus difficile

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut Quartz. Threads perdus ?
    Merci à tous les deux,

    Je vais voir cela :
    " alors il te suffit (d'ajouter l'interface) à ton Job qui l'appelera à la fin de son travail."
    J'économise un objet par rapport à ce que j'avais pensé. C'est déjà ça !

    Mais j'ai une inquiétude concernant la philosophie de Quartz . Je lance mon exécution à partir d'Eclipse. Si j'interromps l'exécution, il ne me semble pas voir de threads tourner tout seuls (en ghosts). Mes logs me l'auraient dit.

    Corrigez-moi si je me trompe ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ben quand ton appli s'arrête quartz s'arrête, c'est normal.

  9. #9
    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
    Citation Envoyé par tchize_ Voir le message
    fxrobin: à quartz on ne passe pas des instances mais des noms de classes, c'est là toute la difficulté. En effet, un nom de classe ça peux se stoker dans une DB, une instance c'est plus difficile
    regarde l'exemple de "mkyong", il le fait bien lui pourtant.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par fxrobin Voir le message
    regarde l'exemple de "mkyong", il le fait bien lui pourtant.
    Au temps pour moi, c'est le "passer au Job" qui m'a confus
    Oui, les listeners, c'est des instances, mais du coup t'as le problème inverse, c'est que les listeners, eux, tu les perds à l'arrêt :/

  11. #11
    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
    Sauf si le Listener est aussi l'appelant ... non ?

    Ou alors il y a un truc que tu voies et qui m'échappe, mais pour moi c'est exactement comme en Swing avec les SwingWorker (voire les ActionListener) : on ne perd aucune instance, on est juste dans un Thread différent (quand c'est bien fait).

    non ?
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut Getter dans le listener
    Merci à tous les deux.

    J'ai modifié l'exemple fourni par http://www.mkyong.com/java/quartz-joblistener-example/.

    J'ajoute un getMessage à HelloJobListener. Ce getter est renseigné par ex. lors de la fin du job et il est lisible par l'objet qui lancé les jobs (soit ici CronTriggerExample ):

    Thread.sleep(10000);
    System.out.println("Message obtained: " + myJobListener.getMessage());
    Dans mon cas personnel, cela suffit. J'obtiens un flag qui m'indique si un job est terminé ou non, quelle erreur est apparue.
    Ce n'est pas un rapport complet, mais c'est déjà bien.

    Encore merci.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par fxrobin Voir le message
    Sauf si le Listener est aussi l'appelant ... non ?
    Quartz est, normalement, utilisé pour scheduler des jobs de manière plus ou moins permanent. A chaue redémarrage de l'appli, quartz récupère les job en attente dans la BD, exécute ceux en retards, etc.

    Par contre, il ne stocke pas les listener, à chaque démarrage de l'appli, il faut réenregistrer les listeners

  14. #14
    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
    Okay.
    Ca doit être comme les @Schedule sur les EJB alors.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  15. #15
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut Quartz : Passage de paramètres
    Bonjour,

    Juste quelques impressions:
    1. Un job peut modifier des informations par context.getJobDetail().getJobDataMap() et peut les garder pour un prochain triggering
    2. Si on passe par context.getMergedJobDataMap(), le job peut modifier les informations, mais je n'ai pas réussi à trouver comment les garder pour un prochain triggering
    3. En fait j'ai l'impression que les deux moyens donnent deux objets distincts et ce qui se passe sur l'un n'est pas vu par l'autre
    4. De plus, context.getJobDetail().getJobDataMap() correspondrait à ce que je veux... sauf que je ne vois pas comment l'objet qui a lancé le trigger peut aller le récupérer.


    Si j'ai une autre idée, je vous en ferai part.

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

Discussions similaires

  1. Passer des paramètres de connections à un job !
    Par hawk16 dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 12/03/2010, 11h28
  2. Passer paramètres d'un formulaire sur plusieurs JSP
    Par itr dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 02/05/2006, 18h42
  3. [AS2] passer paramètre à un constructeur par attachMovie()
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 06/08/2005, 03h32
  4. Réponses: 5
    Dernier message: 24/08/2004, 19h11
  5. Charger des paramètres à partir de beans
    Par lalakers dans le forum ANT
    Réponses: 1
    Dernier message: 19/05/2004, 19h25

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