quarta-feira, 20 de outubro de 2010

Exemplo de utilização do Quartz

O que é o Quartz?


É um framework de agendamento de tarefas.


Com ele você pode por exemplo agendar uma tarefa para executar: uma vez por dia, um vez por semana, uma vez por mês, uma vez a cada 5 minutos etc.


Obs: A finalidade desse post é mostrar de forma rápida e simples algumas funcionalidade desse framework, para que você inicie seu aprendizado no mesmo. Para maiores informações entre no site do Quartz, pois o mesmo tem muito mais recursos do que o apresentado aqui!


Utilizando o Quartz:


Faça o download da versão mais recente no site: http://www.quartz-scheduler.org/, descompacte o arquivo e copie o jar (quando esse post foi escrito a versão era quartz-1.8.3.jar) para o diretório lib de seu projeto.


Criaremos as seguintes classes:
1) Agenda - Responsável pelo agendamento das tarefas.
2) JobDia - Job que será executado uma vez por dia.
3) JobHora - Job que será executado a cada 60 minutos.


Classe Agenda:


 public class Agenda implements ServletContextListener {
 public static Scheduler sched;
 private Logger log;

 @SuppressWarnings("static-access")
 protected void init() throws ObjectAlreadyExistsException {

  try {
   /* Fábrica para criar instância de Scheduler */
   StdSchedulerFactory schedFactory = new StdSchedulerFactory();

   getLog().info("---------------- Criar Agendador ----------------");
   Agenda.sched = schedFactory.getScheduler();


   /* ************************Inicio Job Hora *****************************/
   getLog().info("---------------- Criando Tarefa: JobHora para ser executada a cada 60 minutos ----------------");
   JobDetail jobHora = new JobDetail("JobIntegraBysoft",Scheduler.DEFAULT_GROUP, JobHora.class);

   getLog().info("---------------- Criar Gatilho Job Hora  ----------------");
   SimpleTrigger sptJobHora = new SimpleTrigger(
     "JobHora", sched.DEFAULT_GROUP, new Date(), null,
     SimpleTrigger.REPEAT_INDEFINITELY, 3600L * 1000L);

   getLog().info("---------------- Faz o Agendamento de JobHora ----------------");
   java.util.Date ft = sched.scheduleJob(jobHora, sptJobHora);

   /* Imprime informações do Job */
   getLog().info(jobHora.getFullName() + " Foi programado para funcionar em: "
     + ft + " e repete baseado na expressão: ");
   /* ************************ Fim Job Hora *******************************/


   /* ************************ Inicio Job Dia *****************************/
   getLog().info("---------------- Criando tarefa: JobDia para ser executado todos os dias as 22 horas ----------------");
   JobDetail JobDia = new JobDetail("JobDia",Scheduler.DEFAULT_GROUP,
      JobDia.class);

   getLog().info("---------------- Criar Gatilho Para JobDia  ----------------");
   CronTrigger ctgJobDia = new CronTrigger("JobDia", sched.DEFAULT_GROUP);
   /* setCronExpression(* Segundos,* Minutos,* Horas,* Dias do mês,* Mês,* Dias da semana) */
   ctgJobDia.setCronExpression("0 00 22 * * ?");

   getLog().info("---------------- Faz Agendamento de JobDia ----------------");
   java.util.Date dataAniversariosDoDia = sched.scheduleJob(JobDia, ctgJobDia);

   /* Imprime informações do Job */
   getLog().info(JobDia.getFullName() + " Foi programado para funcionar em: "
     + dataAniversariosDoDia + " e repete baseado na expressão: "); 
   /* ************************ Fim Job Dia **************************** */


   /* Iniciar execução do Scheduler */
   Agenda.sched.start();   



  } catch (Exception e) {
   System.out.println("\n\nErro ao tentar iniciar Scheduler .\n\n");
   e.printStackTrace();
  }
 }


 public void contextInitialized(ServletContextEvent ce) {
  try{
   init();
  }catch (Exception ex) {
   ex.getStackTrace();
  }
 }



 public void contextDestroyed(ServletContextEvent arg0) {
  // Finaliza o schedule
  restart();
 }



 public void restart() {
  try {
   Agenda.sched.shutdown(true);
  } catch (Exception ex) {
   getLog().error("Erro ao tentar reiniciar as tarefas");
   getLog().error(ex.getMessage(), ex);
  }
 }



 protected Logger getLog() {
  if (this.log == null) {
   this.log = Logger.getLogger("AÇÃO : ");
  }

  return this.log;
 }



}


 
Adicione o listener no seu web.xml
<listener>
  <listener-class>br.com.lpc.ganymede.quartz.Agenda</listener-class>
</listener>






Classe JobHora


public class JobHora implements Job {
 @Override
 public void execute(JobExecutionContext arg0) throws JobExecutionException {
  System.out.println("Executando Job Hora");
 }
}








Classe JobDia



public class JobDia implements Job {
 @Override
 public void execute(JobExecutionContext arg0) throws JobExecutionException {
  System.out.println("Executando Job Dia");
 }
}



Execute a aplicação, e veja o resultado na console:

23:06:42,330 INFO  [StdSchedulerFactory] Quartz scheduler version: 1.4.5
23:06:42,330 INFO  [AÇÃO : ] ---------------- Criando Tarefa: JobHora para ser executada a cada 60 minutos ----------------
23:06:42,334 INFO  [AÇÃO : ] ---------------- Criar Gatilho Job Hora  ----------------
23:06:42,338 INFO  [AÇÃO : ] ---------------- Faz o Agendamento de JobHora ----------------
23:06:42,339 INFO  [AÇÃO : ] DEFAULT.JobIntegraBysoft Foi programado para funcionar em: Wed Oct 20 23:06:42 BRST 2010 e repete baseado na expressão:
23:06:42,339 INFO  [AÇÃO : ] ---------------- Criando tarefa: JobDia para ser executado todos os dias as 22 horas ----------------
23:06:42,341 INFO  [AÇÃO : ] ---------------- Criar Gatilho Para JobDia  ----------------
23:06:42,348 INFO  [AÇÃO : ] ---------------- Faz Agendamento de JobDia ----------------
23:06:42,351 INFO  [AÇÃO : ] DEFAULT.JobDia Foi programado para funcionar em: Wed Oct 20 23:07:00 BRST 2010 e repete baseado na expressão:
23:06:42,351 INFO  [QuartzScheduler] Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
23:06:42,480 INFO  [STDOUT] Executando Job Hora
23:06:47,421 INFO  [ServerImpl] JBoss (Microcontainer) [5.0.0.GA (build: SVNTag=JBoss_5_0_0_GA date=200812042120)] Started in 52s:48ms
23:07:00,012 INFO  [STDOUT] Executando Job Dia



Bons estudos!

Um comentário:

  1. Bom dia, estou utilizando o seu exemplo de agendamento, mas quando uso a anotação @In (Jboss Seam) os objetos ficam nulos. Você sabe me dizer o porque disso? [

    ResponderExcluir