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