Domanda

Ho un metodo che restituisce un elenco di elementi chiamato findItemByPIdEndDate () e si trova all'interno della classe MngtImpl.java. Ora vorrei eseguire questo metodo ogni tanto, ogni ora diciamo così ecco cosa ho fatto finora:

Questo è 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){}
  }                                 
}

Ora con questo ho dei problemi. Questa classe viene chiamata dalla classe precedente in base ai vincoli temporali (* tra parentesi) ed esegue il metodo della 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();
        }
  }
}

Ecco il metodo che provo a invocare dalla classe precedente. Questo metodo si trova all'interno della classe denominata 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;
        }

Ora ecco cosa mi piacerebbe fare. Devo eseguire questo metodo sopra basato su un certo periodo di tempo (che potrei specificare in qualsiasi momento). Devo creare un bean all'interno del file xml factory bean che in realtà istanza questo scheduler e chiama questo metodo, e l'ho provato chiamando CronJob.java da CronScheldule.java che chiama il metodo da un'altra classe e ho creato un bean che forse funziona o no

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

Ma non funziona come mi aspettavo ed è piuttosto complicato, posso ottenere aiuto con il codice, per favore? Grazie

Riscontro la seguente eccezione:

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)

Questo è ovviamente un modo sbagliato di fare ciò che ho provato finora come cose da zilion: ecco cosa sto cercando di fare in parole semplici, voglio eseguire il metodo findItemByPIdEndDate () dalla classe MngtImpl ogni minuto. Il metodo funziona correttamente Ho scritto un test e lo supera. Quindi cosa faccio adesso? Grazie

È stato utile?

Soluzione

Solo un puntatore poiché non ho potuto fare molto con la traccia dello stack, ma sembra che il problema sia in pers.findItemByPIdEndDate (); poiché il codice funziona bene quando rimpiazzo l'Hibernate con un semplice classe java.

Inoltre ho fornito il modello CronTrigger come 0/5 * * * *? in modo da eseguirlo per 5 secondi. Il modello corrente non attiva affatto il lavoro.

Vedi se questo è di qualche aiuto.

Altri suggerimenti

Se qui il problema è l'esecuzione periodica di un'attività (non ne sono del tutto sicuro), suggerisco di utilizzare ScheduledExecutorService, che fa parte di JDK 1.5 e versioni successive:

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);
}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top