Pergunta

Eu tenho um método que retorna uma lista de itens chamado findItemByPIdEndDate () e seu interior encontrado classe MngtImpl.java. Agora eu gostaria de executar este método de vez em quando, por hora vamos dizer que isso aqui é o que eu fiz até agora:

Esta é 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){}
  }                                 
}

Agora, com este que eu tenho problemas. Essa classe é chamada a partir da classe acima com base em restrições de tempo (* entre parênteses) e ele executa o método de 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();
        }
  }
}

Aqui está o método que eu tentar invocar a partir da classe acima. Este método é encontrado classe dentro nomeado 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;
        }

Agora, aqui é o que eu gostaria de fazer. Eu preciso executar este este método acima com base em uma certa quantidade de tempo (que eu poderia especificar a qualquer momento). Eu preciso fazer um arquivo xml fábrica de feijão dentro de feijão que realmente casos este agendador e chama esse método, e eu tentei isso chamando CronJob.java de CronScheldule.java que chama o método de outra classe e eu fiz um feijão que talvez trabalhando ou não

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

Mas não o seu trabalho como eu esperava e sua bastante complicado, eu posso obter alguma ajuda com código por favor? Obrigado

I encontrar a seguinte exceção:

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 é obviamente maneira errada de fazer isso que eu tentei como as coisas zilion até agora: Aqui está o que eu estou tentando fazer em palavras simples, eu quero executar findItemByPIdEndDate método () da classe MngtImpl cada Vamos dizer minuto. Método está funcionando corretamente eu escrevi um teste e ele passa-lo. Então, o que eu faço agora? Obrigado

Foi útil?

Solução

Apenas um ponteiro desde que eu não poderia fazer muito pelo rastreamento de pilha, mas parece que o problema está no pers.findItemByPIdEndDate(); já que o código funciona bem quando eu substituir o material Hibernate com uma classe java simples.

Também eu fornecido o padrão CronTrigger como 0/5 * * * * ? modo de executá-lo por 5 segundos. Seu padrão atual não dispara o trabalho em tudo.

Veja se isso é de qualquer ajuda.

Outras dicas

Se a execução de uma tarefa periódica é o problema aqui (eu não estou muito certo) Eu sugiro usar ScheduledExecutorService, que faz parte do JDK 1.5 e posterior:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top