Question

J'ai une méthode qui renvoie une liste d'éléments appelée findItemByPIdEndDate () et la trouve dans la classe MngtImpl.java. Maintenant, je voudrais exécuter cette méthode de temps en temps, disons heure par heure, voici ce que j'ai fait jusqu'à présent:

Ceci est CronSchedule.java

import org.quartz.CronTrigger;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.JobDetail;

public class CronSchedule {
  public CronSchedule ()throws Exception {
    SchedulerFactory sf=new StdSchedulerFactory();
    Scheduler sched=sf.getScheduler();
    JobDetail jd=new JobDetail("job1","group1",CronJob.class);
    CronTrigger ct=new CronTrigger("cronTrigger","group2","0 * * * * ?");
    sched.scheduleJob(jd,ct);
    sched.start();
  }
  public static void main(String args[]){
    try{    
        new CronSchedule();          //Class where cron is created
    }catch(Exception e){}
  }                                 
}

Maintenant, avec celui-ci, j'ai des problèmes. Cette classe est appelée à partir de la classe ci-dessus en fonction de contraintes de temps (* entre parenthèses) et exécute la méthode de la classe MngtImpl.

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import com.rosa.MngtImpl;

public class CronJob implements Job  {
  public void execute(JobExecutionContext arg0) throws JobExecutionException {
          try {
                  MngtImpl pers = new MngtImpl();
                  pers.findItemByPIdEndDate();
        } catch (Exception e) {

                e.printStackTrace();
        }
  }
}

Voici la méthode que j'essaie d'invoquer à partir de la classe ci-dessus. Cette méthode se trouve dans la classe nommée MngtImpl.java

 public List<Long> findItemByPIdEndDate() throws Exception {

                List<Long> list = null;

                try{
                        Session session = sessionFactory.getCurrentSession();   
                        Query query = session.getNamedQuery("endDateChecker");
                        list = query.list();

                }catch (HibernateException e){
                        throw new DataAccessException(e.getMessage());
                }

                return list;
        }

Maintenant, voici ce que j'aimerais faire. Je dois exécuter cette méthode ci-dessus en fonction d'une certaine quantité de temps (que je pourrais spécifier à tout moment). Je dois créer un bean dans un fichier xml à l'intérieur de la fabrique de haricots qui instaure ce planificateur et appelle cette méthode. J'ai essayé de le faire en appelant CronJob.java à partir de CronScheldule.java qui appelle la méthode à partir d'une autre classe et j'ai créé un bean qui fonctionnait ou non.

<bean id="cronSchedule" class="com.mypackage.CronSchedule">
        </bean>

Mais cela ne fonctionne pas comme prévu et c'est assez compliqué, puis-je obtenir de l'aide pour le code s'il vous plaît? Merci

Je rencontre l'exception suivante:

java.lang.NullPointerException 11:10:46,410 ERROR [STDERR]
   at com.packftc.RulesManager.exception(RulesManager.java:25) 11:10:46,410 ERROR [STDERR]
   at org.drools.agent.RuleAgent$2.run(RuleAgent.java:442) 11:10:46,410 ERROR [STDERR]
   at java.util.TimerThread.mainLoop(Unknown Source) 11:10:46,410 ERROR [STDERR]
   at java.util.TimerThread.run(Unknown Source)

C’est évidemment une mauvaise façon de procéder. J’ai essayé jusqu’à présent de faire des choses dignes de zilion: Voici ce que j’essaie de faire en termes simples, je veux exécuter la méthode findItemByPIdEndDate () de la classe MngtImpl chaque minute. La méthode fonctionne correctement. J'ai écrit un test et il le réussit. Alors qu'est-ce que je fais maintenant? Merci

Était-ce utile?

La solution

Juste un pointeur puisque je ne pouvais pas en faire beaucoup avec la trace de la pile, mais il semble que le problème se trouve dans pers.findItemByPIdEndDate (); car le code fonctionne correctement lorsque je remplace le fichier Hibernate par un classe java simple.

J'ai également fourni le modèle CronTrigger sous la forme 0/5 * * * *? afin de l'exécuter toutes les 5 secondes. Votre modèle actuel ne lance pas du tout le travail.

Voir si cela vous aide.

Autres conseils

Si le problème réside dans l'exécution périodique d'une tâche (je ne suis pas tout à fait sûr), je suggère d'utiliser ScheduledExecutorService, qui fait partie de JDK version 1.5 et ultérieure:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class SchedulerExample {

private ScheduledExecutorService scheduler = 
       Executors.newScheduledThreadPool(1);

public void activateHourlyDataRetrieval() {

        Runnable dataRetriever = new Runnable() {

           MngtImpl pers = new MngtImpl();

           public void run() {

               pers.findItemByPIdEndDate();

            }
         };

        scheduler.scheduleAtFixedRate(dataRetriever, 0, 1, TimeUnit.HOURS);
}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top