Pregunta

Tengo un método que devuelve una lista de elementos llamados findItemByPIdEndDate () y se encuentra dentro de la clase MngtImpl.java. Ahora me gustaría ejecutar este método de vez en cuando, cada hora digamos que aquí está lo que hice hasta ahora:

Esto es 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){}
  }                                 
}

Ahora con este tengo problemas. Esta clase se llama desde la clase anterior en función de las restricciones de tiempo (* entre paréntesis) y ejecuta el método de la clase 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();
        }
  }
}

Aquí está el método que trato de invocar desde la clase anterior. Este método se encuentra dentro de la clase llamada 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;
        }

Ahora esto es lo que me gustaría hacer. Necesito ejecutar este método anterior basado en una cantidad de tiempo (que podría especificar en cualquier momento). Necesito hacer un bean dentro del archivo xml de factory bean que realmente instale este programador y llame a este método, e intenté esto llamando a CronJob.java desde CronScheldule.java, que llama al método de otra clase, e hice un bean que tal vez esté funcionando o no.

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

Pero no funciona como esperaba y es bastante complicado, ¿puedo obtener ayuda con el código, por favor? Gracias

Encuentro la siguiente excepción:

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)

Esta es obviamente una manera incorrecta de hacer esto. He intentado cosas como zilion hasta ahora: Esto es lo que estoy tratando de hacer con palabras simples, quiero ejecutar el método findItemByPIdEndDate () de la clase MngtImpl cada minuto, digamos. El método funciona correctamente. Escribí una prueba y la pasa. Entonces qué hago ahora ? Gracias

¿Fue útil?

Solución

Solo un puntero ya que no pude hacer mucho por el seguimiento de la pila, pero parece que el problema está en pers.findItemByPIdEndDate (); ya que el código funciona bien cuando sustituyo el material de Hibernación con un clase de Java simple.

También proporcioné el patrón CronTrigger como 0/5 * * * *? para ejecutarlo por 5 segundos. Su patrón actual no activa el trabajo en absoluto.

Vea si esto es de alguna ayuda.

Otros consejos

Si el problema es ejecutar una tarea periódicamente (no estoy seguro), sugiero utilizar ScheduledExecutorService, que forma parte de JDK 1.5 y versiones posteriores:

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);
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top