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

API standards et tierces Java Discussion :

[QUARTZ] Utilisation d'un EJB dans mon job ou autre solution disponible


Sujet :

API standards et tierces Java

  1. #1
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut [QUARTZ] Utilisation d'un EJB dans mon job ou autre solution disponible
    Bonjour,

    J'ai un Job dans lequel je dois aller rechercher des données en base et ensuite les traiter.
    Le problème est que l'EJB service que j'ai déclaré est toujours null.
    J'ai vu toutes sortes de choses sur le net mais du coup je sais pas bien trop quoi faire pour faire fonctionner tout ça

    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
     
    public class DerniereSaisieJob implements Job {
     
    	@EJB
    	private HeureService m_heureService;
     
    	@Override
    	public void execute(JobExecutionContext arg0) throws JobExecutionException {
    		System.out.println("Executing Job");
     
    		try {
    			LocalDate aujourdhui = new LocalDate();
    			aujourdhui = aujourdhui.minusDays(5);
     
    			List<VwHeureEmploye> lst = m_heureService.getVwHeureEmployeList();
    			if (CollectionUtils.isNotEmpty(lst)) {
    				List<String> lstExclusion = getLstExclusionAsEmailAdresses();
     
                            ......
                    } catch (Exception e) {
    			System.out.println(e);
    			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(e.getMessage()));
    		}
           }
    }
    Qqun peut-il m'aider à trouver une solution ?
    Merci pour votre aide

  2. #2
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Voici une solution qui fonctionne :

    Définir un WebListener
    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
     
    @WebListener
    public class JobListener extends QuartzInitializerListener {
     
    	@Override
    	public void contextInitialized(ServletContextEvent sce) {
    		super.contextInitialized(sce);
            ServletContext ctx = sce.getServletContext();
            StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute(QUARTZ_FACTORY_KEY);
            try {
                Scheduler scheduler = factory.getScheduler();
     
                // Job de contrôle de la saisie des heures (Tous les jeudis à 5h30)
                JobDetail jobDetailControleSaisie = JobBuilder.newJob(DerniereSaisieJob.class).build();
                Trigger triggerControleSaisie = TriggerBuilder.newTrigger().withIdentity("controleSaisieHeures").withSchedule(
                        CronScheduleBuilder.cronSchedule("0 30 5 ? * THU")).startNow().build();
                scheduler.scheduleJob(jobDetailControleSaisie, triggerControleSaisie);
     
                scheduler.start();
            } catch (Exception e) {
                System.out.println("There was an error scheduling the jobs.");
            	ctx.log("There was an error scheduling the jobs.", e);
            }
    	}
    }
    Et dans le job :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class DerniereSaisieJob extends EJB3InvokerJob implements Job {
     
    	@Override
    	public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    		JobDataMap dataMap = jobExecutionContext.getMergedJobDataMap();
    	    dataMap.put(EJB_JNDI_NAME_KEY, "java:app/JobService");
    	    dataMap.put(EJB_METHOD_KEY, "doControlerDerniereSaisie");
     
    	    super.execute(jobExecutionContext);
    	}
    }
    Et le service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    @Stateless
    @EJB(name = "java:app/JobService", beanInterface = JobService.class)
    public class JobServiceImpl implements JobService {
     
    	@EJB
    	private EmployeDao m_employeDao;
     
    	@Override
    	public void doControlerDerniereSaisie() throws MessagingException {
    		...
            }
    }
    D'un coup que ça puisse servir à qqun

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Le problème vient du fait que ta classe n'est pas prise en compte par un système d'injection, du coup, les annotations @EJB ne sont pas traitées.
    La solution simple consiste à faire un lookup jndi pour récupérer l'ejb.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ctx = new InitialContext();
    ctx.lookup("le nom de la facade de l'ejb");  <- ça dépend du serveur utilisé, mais généralement, au démarrage du serveur, il les liste
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Merci pour ta réponse.

    Du coup c'est mieux de faire par lookup jndi ou comme j'ai fais ?

  5. #5
    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
    Ben, c'est déjà comme ça que tu fais, l'ejb invoker job fait un lookup et appelle une méthode sur l'EJB

  6. #6
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Ok, du coup c'est quand même plus propre d'utiliser l' ejb invoker, non ?

  7. #7
    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
    dans l'invoker la méthode est appelée par reflection. Donc pas top quand tu fera du refactoring et la changeant de nom. De plus, tu ne peux pas lui passer facilement des paramètres. En faisant le lookup toi même tu peux caster vers l'interface et appeler toutes les méthodes que tu veux.

  8. #8
    Membre éclairé
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Par défaut
    Très bien, merci

    Du coup j'ai gardé mon listener :
    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
     
    @WebListener
    public class JobListener extends QuartzInitializerListener {
     
    	@Override
    	public void contextInitialized(ServletContextEvent sce) {
    		super.contextInitialized(sce);
                   ServletContext ctx = sce.getServletContext();
                   StdSchedulerFactory factory = (StdSchedulerFactory) ctx.getAttribute(QUARTZ_FACTORY_KEY);
              try {
                Scheduler scheduler = factory.getScheduler();
     
                // Job de contrôle de la saisie des heures (Tous les jeudis à 5h30)
                JobDetail jobDetailControleSaisie = JobBuilder.newJob(DerniereSaisieJob.class).build();
                Trigger triggerControleSaisie = TriggerBuilder.newTrigger().withIdentity("controleSaisieHeures").withSchedule(
                		CronScheduleBuilder.cronSchedule("0 30 5 ? * THU")).startNow().build();
                scheduler.scheduleJob(jobDetailControleSaisie, triggerControleSaisie);
     
                // Job de rappel de saisie des absences planifiées (Le 10 mars, juin, septembre, décembre à 07h15)
                JobDetail jobDetailRappelSaisieAbsences = JobBuilder.newJob(RappelSaisieAbsencesJob.class).build(); 
                Trigger triggerRappelSaisieAbsences = TriggerBuilder.newTrigger().withIdentity("rappelSaisieAbsencesPlanifiees").withSchedule(
                		CronScheduleBuilder.cronSchedule("0 15 7 10W 3,6,9,12 *")).startNow().build();
                scheduler.scheduleJob(jobDetailRappelSaisieAbsences, triggerRappelSaisieAbsences);
     
                scheduler.start();
            } catch (Exception e) {
                System.out.println("There was an error scheduling the jobs.");
            	ctx.log("There was an error scheduling the jobs.", e);
            }
    	}
    }
    Et fais directement dans mon job :
    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
    public class RappelSaisieAbsencesJob implements Job {
    
    	@Override
    	public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    		try {
    			
    			InitialContext ctx = new InitialContext();
    			EmployeService employeService = (EmployeService) ctx.lookup("java:global/erp/EmployeServiceImpl");
    			
    			List<Employe> lst = employeService.getEmployeList(true);
    			if (CollectionUtils.isNotEmpty(lst)) {
    				for (Employe employe : lst) {
    					EmailingUtils.sendEmail(listEmail, "ERP-Rappel saisie des absences planifiées", contenu, false);
    				}
    			}
    		} catch (MessagingException | NamingException e) {
    			e.printStackTrace();
    		}
    	}
    }
    Par contre j'ai toujours un souci sur comment gérer au mieux les erreurs, typiquement la Messaging et Naming Exception. Vous faites comment pour les gérer ?

    Merci

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il faut passer par JobExecutionException, c'est le moyen pour indiquer au scheduler que le job s'est terminé en erreur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/12/2010, 13h50
  2. utiliser le langage latex dans mon code java
    Par guim2708 dans le forum Général Java
    Réponses: 0
    Dernier message: 27/05/2009, 22h08
  3. est ce que je peux utilise step de rechercher dans mon cas?
    Par helene0618 dans le forum kettle/PDI
    Réponses: 2
    Dernier message: 04/05/2009, 09h42
  4. Utilisation d'un Calendrier dans mon application
    Par menzlitsh dans le forum Struts 1
    Réponses: 2
    Dernier message: 22/09/2006, 14h18
  5. Projet VB v6 : utilisation de requête SQL dans mon code
    Par MITCH31 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/10/2005, 15h02

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