A execução de um método de outra classe em Java ... e muito mais
-
05-07-2019 - |
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
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);
}
}