Tentando usar o Quartz com Reflection

0 respostas
R

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;
    }
Criado 7 de dezembro de 2011
Respostas 0
Participantes 1