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!
quarta-feira, 20 de outubro de 2010
Assinar:
Postar comentários (Atom)
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