Olá pessoal,
Já faz algum tempo que eu estou utilizando o agendamento de Jobs utilizando o Quartz de forma “normal”. No entanto, agora eu preciso utilizar Reflection para agendar Jobs. Eu até já consegui fazer isso em uma prova de conceito, mas quando passo para o projeto que estou desenvolvendo, não funciona. Muito estranho. Não ocorre nenhum tipo de erro ou exceção. Já pesquisei muito e não achei ninguém que tivesse um problema parecido. Vejam o código abaixo:
Implementação da Prova de Conceito que funciona:
public static void main(String[] args) {
List<AbstractJob> lstJobs = new ArrayList<AbstractJob>();
try {
lstJobs.add((AbstractJob) Class.forName("meuPacote.Job1").newInstance());
lstJobs.add((AbstractJob) Class.forName("meuPacote.Job2").newInstance());
lstJobs.add((AbstractJob) Class.forName("meuPacote.Job3").newInstance());
} catch (InstantiationException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
try {
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler scheduler = schedFact.getScheduler();
for (AbstractJob job : lstJobs) {
JobDetail jobDetail = JobBuilder.newJob(job.getClass()).build();
Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).forJob(jobDetail).build();
scheduler.scheduleJob(jobDetail, trigger);
}
scheduler.start();
System.out.println("Foi!!");
} catch (Exception e) {
e.printStackTrace();
}
}
Implementação do Projeto que NÃO FUNCIONA!
public static void main(String[] args) {
/*
* Scheduler Factory do Quartz
*/
SchedulerFactory schedFactory = new StdSchedulerFactory();
try {
Scheduler scheduler = schedFactory.getScheduler();;
System.out.println("Inicio da cargas: " + new Date());
/*
* Busca todos os Loaders ativos para executar o agendamento pelo quartz
*/
System.out.println("Buscando os Loaders ativos no Banco de Dados");
LoaderDAO loaderDAO = DAOFactory.getInstance().createLoaderDAO();
List<Loader> lstLoadersAtivos = loaderDAO.findLoadersByAtivo(Boolean.TRUE);
List<AbstractJob> lstJobs = getJobsList(lstLoadersAtivos);
for (AbstractJob job : lstJobs) {
Loader loader = job.getLoader();
if (loader.getPeriodicidade() == null || loader.getPeriodicidade().isEmpty()) {
System.out.println("O Loader " + loader.getNome() + " não possui periodicidade cadastrada.");
}
else {
JobDetail jobDetail = JobBuilder.newJob(job.getClass()).build();
CronScheduleBuilder periodicidade = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
Trigger trigger = TriggerBuilder.newTrigger().withSchedule(periodicidade).forJob(jobDetail).build();
scheduler.scheduleJob(jobDetail, trigger);
}
}
// Inicia o Quartz!
scheduler.start();
System.out.println("Aplicação executando com sucesso");
}
catch (Exception e) {
e.printStackTrace();
System.out.println("Aplicação executando com erros");
}
}
private static List<AbstractJob> getJobsList(List<Loader> lstLoaders) {
List<AbstractJob> lstJobs = new ArrayList<AbstractJob>();
try {
for (Loader loader : lstLoaders) {
AbstractJob job = (AbstractJob) Class.forName(loader.getTratador()).newInstance();
job.setLoader(loader);
lstJobs.add(job);
}
}
catch (Exception e) {
e.printStackTrace();
}
return lstJobs;
}
Agora algumas informações que podem ser úteis:
- Todos os meus Jobs estendem a classe abstrata AbstractJob e essa classe abstrata implementa a interface Job do Quartz;
- O nome (full qualified) das classe das implementações dos Jobs do projeto (que não funciona) estão armazenados no banco e são buscada no trecho: loaderDAO.findLoadersByAtivo(Boolean.TRUE);
- Como eu disse, não ocorre nenhum tipo de erro ou exceção quando tento rodar ou debugar o projeto (que não funciona);
- Estou usando a JDK1.6
- Quartz versão: 2.1.0
- O resultado esperado quando executasse o projeto é a execução de todos os Jobs (são 16) de 5 em 5 segundos como visto na CronTrigger aqui: CronScheduleBuilder.cronSchedule(“0/5 * * * * ?”);
A implementação da classe AbstractJob está assim:
public abstract class AbstractJob implements Job {
private Loader loader;
public Loader getLoader() {
return loader;
}
public void setLoader(Loader loader) {
this.loader = loader;
}